具有多个输出的MultiBinding

时间:2015-05-12 21:41:13

标签: c# wpf mvvm datagrid imultivalueconverter

让我们考虑如下动物Model

public class Animal
{
    public string name { set; get; }
    public int age { set; get; }
}

Animal对象的集合如下:

Dictionary<string, Dictionary<string, ObservableCollection<Animal>>> animals;

在我的ViewModel我填充animals,如:

var lions = new ObservableCollection<Animal>();
lions.Add(new Animal("myLion 1", 2));
var tigers = new ObservableCollection<Animal>();
tigers.Add(new Animal("myTiger 1", 1));
var wild = new Dictionary<string, ObservableCollection<Animal>>();
wild.Add("Lion", lions);
wild.Add("Tiger", tigers);


var cats = new ObservableCollection<Animal>();
cats.Add(new Animal("myCat 1", 2));
cats.Add(new Animal("myCat 2", 4));
var dogs = new ObservableCollection<Animal>();
dogs.Add(new Animal("myDog 1", 1));
var pets = new Dictionary<string, ObservableCollection<Animal>>();
pets.Add("cat", cats);
pets.Add("dog", dogs);


animals = new Dictionary<string, Dictionary<string, ObservableCollection<Animal>>>();
animals.Add("wild animals", wild);
animals.Add("pets", pets);

View我定义了两个ComboBox es和一个DataGrid,其描述如下:

  • 第一个组合框项目为"wild animals""pets",组合框的SelectedItem绑定到selectedAnimalType的{​​{1}}属性。
  • 第二个组合框项目必须首先进行组合框选择;即ViewModel"cat"/"dog"分别为"lion"/"tiger""pet"。此组合框的"wild animals"绑定到SelectedItem的{​​{1}}属性。
  • selectedAnimalCategory根据两个组合框的选定值显示动物。

我的ViewModel已定义并绑定如下:

DataGrid

最后,我将DataGrid定义如下:

<DataGrid>
    <DataGrid.ItemsSource>
        <MultiBinding Converter="{StaticResource animalSelectionConverter}">
            <Binding Path="selectedAnimalType"/>
            <Binding Path="selectedAnimalCategory"/>
        </MultiBinding>
    </DataGrid.ItemsSource>
    <DataGrid.Columns>
        <DataGridTextColumn Header="Animal Type" Binding="{Binding Path=XYZ}"/> <!--The Question-->
        <DataGridTextColumn Header="Name" Binding="{Binding name}"/>
        <DataGridTextColumn Header="Age" Binding="{Binding age}"/>
    </DataGrid.Columns>
</DataGrid>

问题:

我将选定动物集合的AnimalSelectionConverterpublic class AnimalSelectionConverter : IMultiValueConverter { public object Convert(object[] values, Type targetType, object parameter, System.Globalization.CultureInfo culture) { return ViewModel.Default.animals[(string)values[0]][(string)values[1]]; } public object[] ConvertBack(object value, Type[] targetTypes, object parameter, System.Globalization.CultureInfo culture) { throw new NotImplementedException(); } } 绑定到Animal.name列。但是,我也有兴趣在Animal.age上显示第一个组合框的DataGrid(即SelectedItem)。例如,我希望在selectedAnimalType

上看到以下列
DataGrid

DataGrid| Animal Type | Name | Age | --------------------------------------- | pets | myCat 1 | 2 | | pets | myCat 2 | 4 | 传递给转换器,转换器使用此信息加上pets来获取selectedAnimalTypeselectedAnimalCategory。因此,是否可以从myCat 1返回多个值,以便我看到前面提到的myCat 2

如果有人有兴趣看到最小可能的运行代码示例,我准备了一个关于我的问题的小项目,你可以找到源代码here on DropBox

1 个答案:

答案 0 :(得分:1)

除了那个设计的怪异......

不,你不能 Convert的签名是:

Object Convert(
    Object[] values,
    Type targetType,
    Object parameter,
    CultureInfo culture
)

MSDN

所以你必须返回一个对象。该对象甚至可以是Tuple<string, object>,它可以近似多个返回值,但这是一个甚至更差的设计。

如果您想要DataGrid中的数据,我只需为您的组合框命名并执行ElementName绑定:

<DataGridTextColumn Header="Animal Type" 
Binding="{Binding ElementName=TypeComboBox, Path=SelectedItem}"/>

在更一般的情况下,通过命名根元素“Root”并执行此操作来访问主数据上下文:

<DataGridTextColumn Header="Animal Type" 
Binding="{Binding ElementName=Root, Path=DataContext.SelectedType}"/>