【问题标题】:WPF MVVM Routed EventsWPF MVVM 路由事件
【发布时间】:2009-10-18 22:34:55
【问题描述】:

关于 M-V-VM 和命令绑定 (RelayCommand) 的讨论很多,但在 M-V-VM 模式中将路由事件绑定到处理程序的讨论不多。我想找到最好的方法。

这是一个使用自定义事件和绑定到 VM 的事件处理程序的 RoutedEvent 绑定示例。

<Navigation:LeftNavigation x:Name="_leftNav" Margin="3"
            BindingHelper:EventHelper.RoutedEvent="Events:Customer.SelectionChanged"
            BindingHelper:EventHelper.EventHandler="{Binding SelectionChanged}" />

在我的 Vm 中,我会有一个类似的事件处理程序。

public void SelectionChanged(object sender, CustomerSelectionChangedArgs e)
{
    // Do something
}

这只是从命令绑定的许多示例中提取的一个概念。我如何让它适用于路由事件。

【问题讨论】:

    标签: wpf mvvm binding routed-events


    【解决方案1】:

    您可以查看this article,作者实现了类似的语法:

    <Border Background="Yellow" Width="350" Margin="0,0,10,0" Height="35" CornerRadius="2" x:Name="test">
      <local:CommandBehaviorCollection.Behaviors>
        <local:BehaviorBinding Event="MouseLeftButtonDown" Action="{Binding DoSomething}" CommandParameter="An Action on MouseLeftButtonDown"/>
        <local:BehaviorBinding Event="MouseRightButtonDown" Command="{Binding SomeCommand}" CommandParameter="A Command on MouseRightButtonDown"/>
      </local:CommandBehaviorCollection.Behaviors>
      <TextBlock Text="MouseDown on this border to execute the command"/>
    </Border>
    

    【讨论】:

    • 谢谢Jalfp,我自己也尝试过这种技术。我发现这种方法的问题是命令/操作仅使用由命令参数传入的参数执行,但是来自触发它的事件的事件参数呢?有什么解决办法吗,还是我完全走错了路?
    • 我认为您可以更改代码,以便在调用命令时提供参数 Tuple 而不是简单地提供 CommandParameter 对象
    • 其实我只是看了一下源代码,这并不像我想象的那么容易。动态创建一个委托以匹配 EventHandler 的签名,我找不到从这里获取 EventArgs 的方法......如果您不使用完全可定制的方法并为您想要的事件创建附加属性应该更容易。
    • 我知道这是一篇旧帖子,但这就是我回复的原因。是否有人拥有此代码,因为它不再存在于链接的网站上。
    猜你喜欢
    • 2016-06-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-20
    • 1970-01-01
    • 2011-04-22
    • 1970-01-01
    • 2014-06-22
    相关资源
    最近更新 更多