与单个视图关联的多个ViewModel

new*_*ing 19 wpf mvvm

我有一个View,它显示了一个DataGrid绑定到ObservableCollectionViewModel中的a.为了便于讨论,我们假设我们有一个Team包含团队的视图DataGrid,其中每行代表一个Player.

我的问题是我应该使用什么数据类型来代表我的Team收藏中的玩家.集合中的项目是ViewModels本身是一个好主意吗?在这种情况下,我的TeamView将与单个TeamViewModel以及任意数量的PlayerViewModel(在Team集合中)相关联.

将多个ViewModel与单个View相关联是否违反了MVVM的任何设计准则,是否有实现此方案的首选方法?

谢谢!

Kie*_*one 40

不,那没关系; 每个对象本身应该是一个ViewModel.它使代码更清晰,更好的交互,并记住,如果它运作良好,那么它是正确的(即使它违反指南).

我会按照你的处方方式做到这一点.我想我的网格绑定到Team,这将有一个ObservableCollection<Player>,这里Player是另一种视图模型型类.每个行项都会得到PlayerDataContext,所以你仍然可以像你期望的那样绑定到ViewModel属性:并且Player仍然可以拥有s(可能是RelayCommands)的public属性来ICommand进行操作!

希望有所帮助!

  • +1表示"如果效果很好那么它是正确的(即使它违反指南)" (6认同)
  • 我从"如果它的工作正确"得到了一个大声笑,但我看到很多有用的东西,并且远远不正确他们让我想要投掷.:) (2认同)

Gro*_*kys 11

我认为这是推荐的设计,而不是违反指导方针.至少在我的项目中,你会反复看到这种模式.

这种模式与DataTemplates结合使用特别有用.例如,你可以在你的PlayerViewModel的Application.Resources中定义一个DataTemplate,如下所示:

<DataTemplate DataType="viewModels:PlayerViewModel">
    <StackPanel Orientation="Vertical">
        <Image Source="/Images/Player.png"/>
        <TextBlock Text="{Binding Name}"/>
    </StackPanel>
</DataTemplate>
Run Code Online (Sandbox Code Playgroud)

然后,如果您想显示一个玩家列表,只需将ListBox等绑定到TeamViewModel.Players ObservableCollection,您就会自动获得为每个玩家显示的上述DataTemplate:

<ListBox ItemsSource="{Binding Players}"/>
Run Code Online (Sandbox Code Playgroud)