【问题标题】:MVVM way to wire up event handlers in Silverlight在 Silverlight 中连接事件处理程序的 MVVM 方法
【发布时间】:2012-06-19 10:53:26
【问题描述】:

在 Silverlight/WPF 中使用 MVVM 模式,如何连接事件处理程序?我正在尝试将 XAML Click 属性绑定到视图模型中的委托,但无法使其正常工作。

换句话说,我想替换这个:

<Button Content="Test Click" Click="Button_Click" />

Button_Click 在哪里:

private void Button_Click(object sender, RoutedEventArgs e) 
{ 
    // ...
}

用这个:

<Button Content="Test Click" Click="{Binding ViewModel.HandleClick}" />

其中 HandleClick 是处理程序。尝试这样做会引发运行时异常:

“System.Windows.Data.Binding”类型的对象无法转换为“System.Windows.RoutedEventHandler”类型。

【问题讨论】:

    标签: wpf silverlight events mvvm prism


    【解决方案1】:

    执行此操作的 MVVM 方法是使用命令和 ICommand interfaceButton 控件有一个名为Command 的属性,它接收ICommand 类型的对象

    ICommand 的常用实现是Prism's DelegateCommand。要使用它,您可以在视图模型中执行此操作:

    public class ViewModel
    {
        public ICommand DoSomethingCommand { get; private set; }
    
        public ViewModel()
        {
            DoSomethingCommand = new DelegateCommand(HandleDoSomethingCommand);
        }
    
        private void HandleDoSomethingCommand()
        {
            // Do stuff
        }
    }
    

    然后在 XAML 中:

    <Button Content="Test Click" Command={Binding DoSomethingCommand} />
    

    另外,请确保将视图模型设置为视图的 DataContext。一种方法是在视图的代码隐藏中:

    this.DataContext = new ViewModel();
    

    如果您想了解更多关于 MVVM 的信息,This article 是一个不错的起点。

    【讨论】:

      【解决方案2】:

      答案是使用微软在Prism 框架中提供的扩展。使用 DLL System.Windows.Interactivity.dllMicrosoft.Expression.Interactions.dll,可以将事件绑定到视图模型中的处理程序方法: p>

      <Button Content="Test Click"
          xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"      
          xmlns:ei="http://schemas.microsoft.com/expression/2010/interactions"
          >
          <i:Interaction.Triggers>
              <i:EventTrigger EventName="Click">
                  <ei:CallMethodAction TargetObject="{Binding ViewModel}" MethodName="HandleClick" />
              </i:EventTrigger>
          </i:Interaction.Triggers>
      </Button>
      

      【讨论】:

      • 我想说这个方法可能应该用于Click以外的事件,因为Button控件已经有Command属性,这使它更容易(并且可能更正确) 用于Click 事件。
      猜你喜欢
      • 1970-01-01
      • 2010-12-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-23
      • 2016-10-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多