让我们考虑如下动物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>
问题:
我将选定动物集合的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();
}
}
绑定到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
?
如果有人有兴趣看到最小可能的运行代码示例,我准备了一个关于我的问题的小项目,你可以找到源代码here on DropBox。
答案 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}"/>