我有一个集合,其中包含从同一接口(interface)继承的多种类型的项目。这绑定(bind)到ItemsControl。窗口的DataContext设置为保存集合的ViewModel。
我想做的是让集合中不同类型的每个项目都使用不同的ViewModel。
因此,如果我的itemscontrol中的模板是按以下方式设置的,则我希望第一个模板的ViewContext为DataModel,第二个的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>
最佳答案
您为什么不公开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");
}
并更改您的数据模板以绑定(bind)到 View 模型,而不是项目...
关于c# - 具有多个ViewModel的WPF MVVM ItemsControl,具体取决于对象类型,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3816961/