【问题标题】:WPF MVVM ItemsControl with Multiple ViewModels depending on the object type具有多个 ViewModel 的 WPF MVVM ItemsControl,具体取决于对象类型
【发布时间】:2011-04-18 12:48:29
【问题描述】:

我有一个集合,其中包含所有从同一接口继承的多种类型的项目。这绑定到 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>

【问题讨论】:

    标签: c# wpf mvvm


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

      为什么不直接公开 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");
      }
      

      并更改您的数据模板以绑定到视图模型,而不是项目...

      【讨论】:

        猜你喜欢
        • 2019-03-11
        • 1970-01-01
        • 2016-01-04
        • 1970-01-01
        • 1970-01-01
        • 2011-07-25
        • 2014-09-02
        • 2017-10-15
        • 2016-08-01
        相关资源
        最近更新 更多