WPF MVVM - 在ItemsControl内部的命令绑定

Ric*_*ich 9 .net wpf mvvm

我目前正在将一个小型WPF项目转换为MVVM.我有一个List<CustomObject>在我的ItemsControl绑定的主窗口的ViewModel中,并使用DataTemplate来构建每个元素的UI.我的旧代码使用DataTemplate中的事件处理程序来处理click事件.我想使用某种命令绑定来消除我的代码隐藏事件处理程序,但我的ItemsControl中项目的DataContext是模型对象,所以我目前无法从ViewModel绑定到ICommand.

所以,我想有几种方法可以解决这个问题,而且我不确定哪种方法可以做到最"MVVM".我是否将ItemsControl.ItemsSource绑定到表示每个项目的新ViewModel类的集合?或者我使用UserControls而不是DataTemplate然后我可以将每个UserControl绑定到它自己的代表它的ViewModel实例?或者是否有某种绑定表达式我可以用来引用窗口的DataContext来访问绑定到ViewModel(因为我输入它,它听起来很糟糕,所以我假设一个很大的"否"给这个理念)?

另外,我想将命令绑定到的是Grid控件的LeftMouseButtonUp事件.网格没有"命令",所以我试图使用InputBindings.我可以使用静态命令(例如内置的ApplicationCommands之一),但是我无法使用绑定表达式绑定到作为ViewModel属性的ICommand实例,因为MouseBinding.Command不是DependencyProperty.

我对MVVM中的事件处理主题非常困惑,所以任何和所有信息都很受欢迎.

rmo*_*ore 19

我是否将ItemsControl.ItemsSource绑定到表示每个项目的新ViewModel类的集合?

是否创建CustomObjectViewModel来托管命令或将命令放在具有列表的同一ViewModel中,实际上取决于发生的操作的功能.它是属于CustomObject的东西,还是属于当前ViewModel的东西?

或者是否有某种绑定表达式我可以用来引用窗口的DataContext来访问绑定到ViewModel(因为我输入它,它听起来很糟糕,所以我假设一个很大的"否"给这个理念)?

这并不像听起来那么糟糕.你真的不需要Window的DataContext,只需要在切换到各个项之前的DataContext.因此,如果您的命令位于承载CustomObjects List的同一ViewModel上,则可以使用以下任一方法从CustomObject的DataTemplate中绑定它:

{Binding ElementName=uiCustomObjectsItemsControl, Path=DataContext.MyCommand}
{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type ItemsControl}}, Path=DataContext.MyCommand}
Run Code Online (Sandbox Code Playgroud)

另外,我想将命令绑定到的是Grid控件的LeftMouseButtonUp事件.网格没有"命令",所以我试图使用InputBindings.

为此,我会使用类似附加命令行为的东西,它可以让你将ICommand附加到任何事件.


mic*_*tan 4

Josh Smith 在 MSDN上写了一篇精彩的文章,其中讨论了命令绑定。

就你而言,它可以归结为:

  • 您不会消除所有隐藏代码,但它可能看起来会有所不同
  • 您的 CustomObjects 可能必须具有 VM shim 类,或者本身就是 VM,才能利用他描述的 RelayCommand 架构。

HTH。