c# - 使用 EventTrigger 引发附加事件

标签 c# wpf xaml routed-events

我有一个类 MyAttachedEventClassAquarium,它定义了从 MSDN 文档中获取的自定义附件。我有一个 Window,它在 XAML 中使用 EventTrigger 来 Hook 要在 Window 的 View 模型上处理的事件。 View 模型被声明为本地资源。

<Window.Resources>
    <local:WinVM x:Key="myWinVM" />
</Window.Resources>
<i:Interaction.Triggers>
    <i:EventTrigger EventName="NeedsCleaning" SourceName="MyAttachedEventClassAquarium">
        <ei:CallMethodAction MethodName="MyCustomEventWasRaised" TargetObject="{StaticResource myWinVM}" />
    </i:EventTrigger>
</i:Interaction.Triggers>

我使用窗口自己的 RaiseEvent 从按钮按下处理程序引发附加事件:

    private void button1_Click(object sender, RoutedEventArgs e)
    {
        ((Window1)((Grid)((Button)sender).Parent).Parent).RaiseEvent(new RoutedEventArgs(MyAttachedEventClassAquarium.NeedsCleaningEvent));
    }

为什么不调用我的处理程序?

提前致谢。

B.

最佳答案

(已编辑)

这种为 ViewModel 处理 Hook 事件的方法看起来不太可能维护。要对其进行故障排除,最好使用 Snoop 实用程序将可视树和逻辑树分开,以确保您正在转换的对象(所有这些对象都实现了 RaiseEvent 方法)实际上是您想要的对象。

您可能还需要将 SourceName 参数定义为 Window 上的资源。

这些都是猜测,它们描述了一种与 MVVM 模式所要求的非常不同的消息传递方法。与其像那样深入研究你的逻辑树,这是一种非常脆弱的方法,不如使用在下面和其他地方找到的记录和证明的模式:访问 WindowDataContext 并调用直接VM方法。或者,在您的 ViewModel 类中实现一个 ICommand 并将命令绑​​定到它。

第一种方法打破了最纯粹的 MVVM 方法,但它会起作用。

private void button1_Click(object sender, RoutedEventArgs e)
    {
       var VM = this.DataContext As WinVM;

       if (VM != null) 
       {
         VM.MyCustomEventWasRaised();
       }
    }

另一种方法是在您的 ViewModel 类上实现 ICommand,并在 View 中配置 Button 以使用命令:

<Button x:Name="Button1" Command="{Binding NeedsCleaning}" />

在大多数情况下,后者将消除对任何 XAML 代码隐藏代码的需要。

关于c# - 使用 EventTrigger 引发附加事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17870679/

相关文章:

c# - 从 c# 连接到 mLab MongoDB 时遇到问题

c# - 将字节数组直接反序列化为 JSON.Net 中的对象

WPF 在 WPF 中使用 SVG 文件作为图标的正确方法是什么

c# - WPF - 具有多重绑定(bind)的工具提示

c# - 将文本 block 的可见性属性绑定(bind)到 Stack.Any

wpf - 线程是使用不接受参数的 ThreadStart 委托(delegate)创建的

c# - 如何从具有多个路径的 svg 图像创建 appbar 按钮 PathIcon?

c# - 尝试优化 linq 查询

WPF 如何将 Popup 附加到像矩形这样的简单 UIElement

c# - Contentcontrol 找不到我的数据模板,它是 ViewModel