首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >多输出MultiBinding

多输出MultiBinding
EN

Stack Overflow用户
提问于 2015-05-12 21:41:13
回答 1查看 736关注 0票数 1

让我们考虑动物Model,如下所示:

代码语言:javascript
复制
public class Animal
{
    public string name { set; get; }
    public int age { set; get; }
}

Animal对象的集合如下:

代码语言:javascript
复制
Dictionary<string, Dictionary<string, ObservableCollection<Animal>>> animals;

在我的ViewModel中,我填充了animals,例如:

代码语言:javascript
复制
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中,我定义了两个ComboBoxes和一个DataGrid,描述如下:

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

我的DataGrid被定义并绑定如下:

代码语言:javascript
复制
<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定义为:

代码语言:javascript
复制
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.nameAnimal.age绑定到DataGrid列。但是,我也有兴趣在SelectedItem上展示第一个combobox (即selectedAnimalType)。例如,我希望在我的DataGrid上看到如下列:

代码语言:javascript
复制
| Animal Type |    Name     |   Age   |
---------------------------------------
|     pets    |   myCat 1   |    2    |
|     pets    |   myCat 2   |    4    |

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

为了防止任何人有兴趣看到一个尽可能少的运行代码示例,我准备了一个我的问题的小项目,您可以找到源代码在DropBox上

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-05-12 22:02:25

别提那个设计的怪异之处.

不,您不能 Convert的签名是:

代码语言:javascript
复制
Object Convert(
    Object[] values,
    Type targetType,
    Object parameter,
    CultureInfo culture
)

(MSDN

所以你必须返回一个对象。该对象甚至可以是一个近似于多个返回值的Tuple<string, object>,但这是一个更糟糕的设计。

如果要在DataGrid中使用这些数据,我只需将组合框命名为组合框并执行ElementName绑定:

代码语言:javascript
复制
<DataGridTextColumn Header="Animal Type" 
Binding="{Binding ElementName=TypeComboBox, Path=SelectedItem}"/>

在更一般的情况下,通过命名根元素" root“来访问主数据上下文,并这样做:

代码语言:javascript
复制
<DataGridTextColumn Header="Animal Type" 
Binding="{Binding ElementName=Root, Path=DataContext.SelectedType}"/>
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30201910

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档