McG*_*gle 1 silverlight wpf events prism mvvm
在 Silverlight/WPF 中使用 MVVM 模式,如何连接事件处理程序?我正在尝试将 XAML Click属性绑定到视图模型中的委托,但无法使其工作。
换句话说,我想替换这个:
<Button Content="Test Click" Click="Button_Click" />
Run Code Online (Sandbox Code Playgroud)
其中 Button_Click 是:
private void Button_Click(object sender, RoutedEventArgs e)
{
// ...
}
Run Code Online (Sandbox Code Playgroud)
有了这个:
<Button Content="Test Click" Click="{Binding ViewModel.HandleClick}" />
Run Code Online (Sandbox Code Playgroud)
其中 HandleClick 是处理程序。尝试此操作会引发运行时异常:
“System.Windows.Data.Binding”类型的对象无法转换为“System.Windows.RoutedEventHandler”类型。
MVVM 的方法是使用命令和ICommand界面。该Button控件有一个名为的属性Command,它接收一个类型的对象ICommand
一个常用的实现ICommand是Prism 的DelegateCommand. 要使用它,您可以在视图模型中执行此操作:
public class ViewModel
{
public ICommand DoSomethingCommand { get; private set; }
public ViewModel()
{
DoSomethingCommand = new DelegateCommand(HandleDoSomethingCommand);
}
private void HandleDoSomethingCommand()
{
// Do stuff
}
}
Run Code Online (Sandbox Code Playgroud)
然后在 XAML 中:
<Button Content="Test Click" Command={Binding DoSomethingCommand} />
Run Code Online (Sandbox Code Playgroud)
此外,请确保将 viewmodel 设置为您的视图的 DataContext。一种方法是在您视图的代码隐藏中:
this.DataContext = new ViewModel();
Run Code Online (Sandbox Code Playgroud)
如果您想了解更多关于 MVVM 的信息,这篇文章是一个很好的起点。