2010-09-28 58 views
2

我有一个集合,它拥有所有从同一个接口继承的多种类型的项目。这绑定到一个ItemsControl。窗口的DataContext被设置为保存集合的ViewModel。WPF MVVM ItemsControl具有多个ViewModels,具体取决于对象类型

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

因此,如果我的项目控件中的模板是像下面这样设置的,我希望第一个模板具有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> 

回答

5

为什么你不公开一个ViewModels的集合?

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

也许你可以使用一个ValueConverter,将产生正确的视图模型

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

不确定它是否可以工作,但值得一试。

相关问题