让我们考虑一种动物 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
的组合框绑定(bind)到 selectedAnimalType
ViewModel
的属性(property). "cat"/"dog"
或 "lion"/"tiger"
分别为 "pet"
或 "wild animals"
. SelectedItem
此组合框的绑定(bind)到 selectedAnimalCategory
ViewModel
的属性(property). DataGrid
根据两个组合框的选定值显示动物。 我的
DataGrid
定义和绑定(bind)如下:<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>
最后,我定义了
AnimalSelectionConverter
如下:public 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();
}
}
问题:
我正在绑定(bind)
Animal.name
和 Animal.age
选定的动物集合到 DataGrid
的列.但是,我也有兴趣展示 SelectedItem
selectedAnimalType
上的第一个组合框(即 DataGrid
) .例如,我想在我的 DataGrid
上看到如下列:| Animal Type | Name | Age |
---------------------------------------
| pets | myCat 1 | 2 |
| pets | myCat 2 | 4 |
pets
通过 selectedAnimalType
到转换器,转换器使用此信息加上 selectedAnimalCategory
获取 myCat 1
和 myCat 2
.因此,是否可以从 MultiValueConverter
返回多个值?以便我看到我的DataGrid
如前所述?以防万一有人有兴趣查看最小可能的运行代码示例,我准备了我的问题的一个小项目,您可以找到源代码 here on DropBox .
最佳答案
除了那个设计的奇怪之处......
不,你不能 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}"/>
关于c# - MultiBinding 与多个输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30201910/