具有多个ViewModel的WPF MVVM ItemsControl,具体取决于对象类型

时间:2010-09-28 20:52:53

标签: c# wpf mvvm

我有一个包含多种类型项目的集合,这些项目都从同一个接口继承。这绑定到ItemsControl。窗口的DataContext设置为包含集合的ViewModel。

我想要做的是让集合中不同类型的每个项目使用不同的ViewModel。

因此,如果我在itemscontrol中的模板设置如下,我希望第一个模板具有ViewModel1的DataContext,第二个模板具有ViewModel2的DataContext。我无法直接在它们上设置DataContext,因为ItemsControl会将DataContext设置为该项。

任何人都知道这个解决方案,或者使用MVVM更好的方法吗?

<DataTemplate DataType="{x:Type Models:ItemType1}">
    <Controls:MyControl Text="{Binding Body}"/>
</DataTemplate>

<DataTemplate DataType="{x:Type Models:ItemType2}">
    <Controls:MyControl2 Text="{Binding Body}"/>
</DataTemplate>

2 个答案:

答案 0 :(得分:5)

为什么不公开一组ViewModel?

var viewModels = new ObservableCollection<ViewModelBase>(items.Select(CreateViewModelFromItem));


private ViewModelBase CreateViewModelFromItem(Item item)
{
    if (item is ItemType1) return new ViewModel1((ItemType1)item);
    if (item is ItemType2) return new ViewModel2((ItemType2)item);
    ...
    throw new ArgumentException("Unknown model type");
}

并更改您的datatemplates以绑定到viewmodels,而不是项目...

答案 1 :(得分:1)

也许您可以使用 ValueConverter 来生成正确的 ViewModel

<DataTemplate DataType="{x:Type Models:ItemType1}">
    <Controls:MyControl DataContext="{Binding Converter=ViewModelLocator}" Text="{Binding Body}"/>
</DataTemplate>

不确定它是否可行,但值得一试。

相关问题