1

让我们考虑以下动物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);

ViewI 中定义了两个ComboBoxes 和一个DataGrid,描述如下:

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

MyDataGrid的定义和约束如下:

<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.ageDataGridSelectedItemselectedAnimalTypeDataGridDataGrid

| Animal Type |    Name     |   Age   |
---------------------------------------
|     pets    |   myCat 1   |    2    |
|     pets    |   myCat 2   |    4    |

pets被传递selectedAnimalType给转换器,转换器使用此信息加上selectedAnimalCategory来获取myCat 1myCat 2。因此,是否可以从 中返回多个值,MultiValueConverter以便我看到我DataGrid的上述?

以防万一有人有兴趣查看可能的最小运行代码示例,我准备了我的问题的一个小项目,您可以在 DropBox 上找到源代码。

4

1 回答 1

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}"/>
于 2015-05-12T22:02:25.953 回答