gpt4 book ai didi

c# - MultiBinding 与多个输出

转载 作者:行者123 更新时间:2023-12-03 10:35:45 29 4
gpt4 key购买 nike

让我们考虑一种动物 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/

    29 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com