使用组合框进行多重绑定

时间:2017-10-19 15:06:01

标签: c# wpf mvvm

我有2个ComboBox,1个textBox和1个按钮,按钮有多个绑定来传递combox和文本框的值,但是1个组合框中填充了我创建的Objec并且只有一个DataTemplate显示我创建的对象的1个属性。当我在ViewModel中获取值时,对于填充了字符串和texBox的combox工作正常,但是当我检查另一个combox的值时,返回一个字符串,其中包含我创建的对象的名称。

我应该怎么做才能获得对象的属性(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();
    }
}

1 个答案:

答案 0 :(得分:0)

这是绑定:

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

ComboBox中的所选项目是PocoCombo的实例。你想要那个实例的Id属性 - 就是这样。

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