我目前正在将一个小型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附加到任何事件.
Josh Smith 在 MSDN上写了一篇精彩的文章,其中讨论了命令绑定。
就你而言,它可以归结为:
HTH。