【问题标题】:Multibinding with combobox使用组合框进行多重绑定
【发布时间】:2018-03-31 16:18:56
【问题描述】:

我有 2 个组合框、1 个文本框和 1 个按钮,该按钮具有多重绑定以传递组合框和文本框的值,但组合框的 1 个填充了我创建的对象,并且只有一个 DataTemplate显示我创建的对象的属性 1。当我在 ViewModel 中获取值适用于填充字符串和 texBox 的组合框时,但是当我检查另一个组合框的值时,我会返回一个带有我创建的对象名称的字符串。

我应该怎么做才能获取对象的属性(Id)而不是名称?

XAML

<ComboBox x:Name="comboBox1" HorizontalAlignment="Left" Margin="183,59,0,0" VerticalAlignment="Top" Width="120" ItemsSource="{Binding _combo}">
        <ComboBox.ItemTemplate>
            <DataTemplate>
                <StackPanel Orientation="Horizontal">
                    <TextBlock Text="Situación: "></TextBlock>
                    <TextBlock Text="{Binding Path=Nombre}" Width="80"></TextBlock>
                </StackPanel>
            </DataTemplate>
        </ComboBox.ItemTemplate>

    </ComboBox>

    <Button x:Name="button" Content="Button" HorizontalAlignment="Left" Margin="573,66,0,0" VerticalAlignment="Top" Width="75" >
        <Button.CommandParameter>
            <MultiBinding Converter="{StaticResource ResourceKey=multiDateConverter}">
                <Binding ElementName="textBox" Path="Text"></Binding>
                <Binding ElementName="comboBox" Path="Text"></Binding>
                <Binding ElementName="comboBox1" Path="Text"></Binding>
            </MultiBinding>
        </Button.CommandParameter>
        <Button.Command>
            <Binding Path="GetAllActionLogsBetweenDatesCommand"></Binding>
        </Button.Command>
    </Button>

这是目标代码

 namespace PedidosRetraso.Model
{
    class PocoCombo
    {
        public int Id { get; set; }
        public string Nombre { get; set; }
    }
    class Prueba: PocoCombo
    {

    }
}

ViewModel 代码:

class ViewModelMain 
    {
        public ICommand GetAllActionLogsBetweenDatesCommand { get; set; }

        public ObservableCollection<PocoCombo> _combo { get; set; }


        public ViewModelMain()
        {
            GetAllActionLogsBetweenDatesCommand = new RelayCommand(GetAllActionLogsBetweenDates_Execute);

            _combo = new ObservableCollection<PocoCombo> { new PocoCombo { Id = 20, Nombre = "Enviado" }, new PocoCombo { Id = 25, Nombre = "DIF" }, new PocoCombo { Id = 30, Nombre = "Confirmado" }, new PocoCombo { Id = 40, Nombre = "RP" }, new PocoCombo { Id = 50, Nombre = "Cerrado" }, new PocoCombo { Id = 60, Nombre = "C" } };
        }

  private void GetAllActionLogsBetweenDates_Execute(object parameter)
    {
        try
        {
            var stringList = parameter as string[];

            string proveedor = stringList[0];
            string empresa = stringList[1];
            string situacion = stringList[2];
            DateTime fecha = DateTime.Parse(stringList[3]);
            // Aqui la consulta SQL
        }
        catch (Exception ex)
        {

        }
    }

最后是转换器:

public class ICommandMultiDateConverter : IMultiValueConverter
{
    public object Convert(object[] values, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        PocoCombo p = new PocoCombo();
        //p = (PocoCombo)values[2];
        return new string[] { values[0].ToString(), values[1].ToString(), values[2].ToString(),values[3].ToString() };
    }

    public object[] ConvertBack(object value, Type[] targetTypes, object parameter, System.Globalization.CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

【问题讨论】:

    标签: c# wpf mvvm


    【解决方案1】:

    这是绑定:

    <Binding ElementName="comboBox1" Path="SelectedItem.Id" />
    

    ComboBox 中的选定项是PocoCombo 的一个实例。你想要那个实例的Id 属性——它就在那里。

    另外,将_combo 重命名为Combo 是个好主意。带有下划线前缀的小写名称被普遍理解为表示它是一个私有字段。为避免混淆,公共属性应以“PascalCase”命名:在这种情况下为Combo。这个错误不会破坏你的代码,但修复它会让你的代码更容易被人们理解。

    【讨论】:

    • 是的,我读到了 private 是小写的和 public whith 大写的,但我不知道为什么我认为它是私有的,今天不是我的日子。。谢谢答案是完美的。
    猜你喜欢
    • 2014-08-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-26
    • 1970-01-01
    • 2023-03-08
    • 1970-01-01
    • 2011-01-06
    相关资源
    最近更新 更多