【问题标题】:Passing event args and sender to the RelayCommand将事件参数和发送者传递给 RelayCommand
【发布时间】:2010-06-03 06:51:25
【问题描述】:

使用 RelayCommand 时如何获取事件发送者?

【问题讨论】:

    标签: .net mvvm-light relaycommand


    【解决方案1】:

    这是那些令人痛苦的%¤# 答案之一,我实际上并没有回答您的问题,而是向您介绍您应该采取哪些不同的做法。所以,很抱歉。如下:

    如果您发现自己处于需要获取视图模型中的发送者对象的位置,那么您可能应该做一些不同的事情。例如,通过在视图模型中引用按钮或列表框,您可以使视图模型了解它不应该知道的 UI 概念。我的建议是转而连接到代码隐藏页面中的事件,找出您需要了解的有关发送者的信息或其他信息,然后以编程方式执行 viewmodel 命令。这也违反了 MVVM “规则”,但恕我直言,这比在视图模型中引用发件人要轻得多。

    【讨论】:

    • 正如 VM 不应该公开 Visibilty(而是在 XAML 中使用转换器)一样,也许应该有某种方式使用转换器以另一种方式......从视图转换基于 eventarg 到非视图类型?
    • 您的建议是否也违反了 MVVM 规则?对我来说似乎很好。
    • 我认为我当时的主要问题是,与仅将按钮(在视图中)绑定到 VM 中的命令相比,它过于复杂。现在看,我觉得你是对的。它并没有真正违反任何规则。
    【解决方案2】:

    我遇到了类似的问题,但只需要获取 EventArgs。很高兴,一旦我在 Stack Overflow 的另一个线程中找到了答案,这将非常简单。

    <cmd:EventToCommand Command="{Binding SomeCommand, Mode=OneWay}" PassEventArgsToCommand="True"/>
    

    一旦您了解了“PassEventArgsToCommand”这个神奇的设置,您就大功告成了。只需使用 RelayCommand&lt;type&gt; 而不是普通的 RelayCommand。

    我希望这会有所帮助。

    【讨论】:

    • 只想评论一下:PassEventArgsToCommand 不是很干净,因为它通过将 UI 类(EventArgs)引入 VM 来破坏关注点的分离。使用它会使您的 VM 的可测试性降低。但是,在某些情况下(例如拖放),其他任何东西都会更脏。这就是我将它添加到 EventToCommand 中的原因。不过要小心使用!
    • 虽然 PassEventArgsToCommand 可能不干净,但我发现尝试将 SkyDrive 支持添加到我的 WP7 应用程序很有用。登录按钮通过事件参数传递实时会话信息。我可能可以在代码隐藏中处理事件,将 Session 属性设置到 ViewModel 上,然后调用命令。 PassEventArgsToCommand 有助于编写易于理解的代码。
    【解决方案3】:

    这可以通过将发送者绑定到命令参数来完成。

    <command:EventToCommand
                  Command="{Binding CommandName}"
                  CommandParameter="{Binding RelativeSource=
                                             { RelativeSource FindAncestor, 
                                               AncestorType={x:Type TypeOfSender},
                                               AncestorLevel=1}}" 
                  PassEventArgsToCommand="True" >
    </command:EventToCommand>
    

    【讨论】:

    • 我对此表示赞同,因为虽然 Henrik 正确地解释了不应该这样做,但世界并不完美,实现纯 MVVM 有时是不可能的。例如,如果您希望 Textbox 在获得焦点时选择所有文本,则需要 TextBox 本身调用其 SelectAll() 成员。这在 MVVM 中无疑是可行的,但它会创建极其复杂的代码,而这种解决方案在某些情况下“足够好”。我同意应尽可能不鼓励这种行为,但有时你只需要务实,这样的修复虽然丑陋,但有效。
    • 另一个例子:WPF WebBrowser 控件。您可以将命令绑定到 Navigated 事件,但如果您确实想对 http 响应执行某些操作,则需要对浏览器本身的引用,因为该信息不在 eventargs 中。
    猜你喜欢
    • 1970-01-01
    • 2017-04-29
    • 1970-01-01
    • 1970-01-01
    • 2019-03-02
    • 1970-01-01
    • 2017-01-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多