我有一个集合,其中包含从同一接口(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/

10-13 05:56