我打赌这已被多次回答,但......
对于UserControl上的按钮将其command属性设置为Find(ApplicationCommands.Find)之类的简单情况,ViewModel将如何处理该命令?我经常看到命令处理程序连接到一个CommandBinding,它被添加到UIElement上的CommandBindings集合中,但是我的ViewModel并不是从UIElement派生的(应该吗?).这些命令本身不会公开要在执行时通知的事件,那么我应该在哪里连接以获取该信息?
编辑:我想使用股票WPF来解决问题,如果可能的话.我知道有很多可用的框架用于此类事情,但希望保持代码简单.
EDIT2:包含一些示例代码.
<UserControl>
<UserControl.DataContext>
<local:MyViewModel/>
</UserControl.DataContext>
<Button Command="Find"/>
</UserControl>
Run Code Online (Sandbox Code Playgroud)
哪里:
class MyViewModel
{
// Handle commands from the view here.
}
Run Code Online (Sandbox Code Playgroud)
我可以向UserControl添加一个CommandBinding,它将处理Executed,然后在MyViewModel中调用一个假设的Find方法来完成实际的工作,但这是额外的和不必要的代码.我更喜欢ViewModel本身处理Find命令.一种可能的解决方案是让MyViewModel派生自UIElement,但这似乎是反直觉的.
命令的目的是将生成命令的代码与执行命令的代码解耦。因此:如果想要紧密耦合,最好通过事件来实现:
<UserControl ... x:Class="myclass">
...
<Button Click="myclass_find" .../>
...
</UserControl>
Run Code Online (Sandbox Code Playgroud)
对于松散耦合,您需要添加一个CommandBinding到您的UserControl:
<UserControl ... >
<UserControl.DataContext>
<local:MyViewModel/>
</UserControl.DataContext>
<UserControl.CommandBindings>
<Binding Path="myFindCommandBindingInMyViewModel"/>
</UserControl.CommandBindings>
...
<Button Command="ApplicationComamnd.Find" .../>
...
</UserControl>
Run Code Online (Sandbox Code Playgroud)
(不确定语法)
或者您可以在构造函数中CommandBinding添加a ,从 ViewNodel 获取值:UserControlCommandBindings
partial class MyUserControl : UserControl
{
public MyUSerControl()
{
InitializeComponent();
CommandBinding findCommandBinding =
((MyViewModel)this.DataContext).myFindCommandBindingInMyViewModel;
this.CommandBindings.Add(findCommandBinding);
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4849 次 |
| 最近记录: |