c# - MultiBinding 与多个输出

标签 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的组合框绑定(bind)到 selectedAnimalType ViewModel 的属性(property).
  • 第二个组合框项绑定(bind)到第一个组合框选择;即 "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.nameAnimal.age选定的动物集合到 DataGrid 的列.但是,我也有兴趣展示 SelectedItem selectedAnimalType 上的第一个组合框(即 DataGrid ) .例如,我想在我的 DataGrid 上看到如下列:
    | Animal Type |    Name     |   Age   |
    ---------------------------------------
    |     pets    |   myCat 1   |    2    |
    |     pets    |   myCat 2   |    4    |
    
    pets通过 selectedAnimalType到转换器,转换器使用此信息加上 selectedAnimalCategory获取 myCat 1myCat 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/

    相关文章:

    c# - Parallel.ForEach 和无法从关闭的 TextReader 异常中读取

    c# - C# 应用程序可以使用多少 RAM?

    c# - 将派生类的列表<>转换为基类的列表<>

    c# - WPF 命令绑定(bind)到祖先属性

    c# - MVVM:使用Fody.PropertyChanged更改了属性的触发方法

    c# - 将 SQLite Blob 转换为十六进制再转换为字符串

    c# - 在上下文菜单中设置文本框的焦点 - wpf

    c# - 将 Textblock 文本绑定(bind)到 2 个不同的属性

    c# - 如何在包含文件的网格中显示文件上下文菜单

    android - 删除在闭包内创建的实时数据 Observer