【问题标题】:How to use custom RoutedEventArgs with MenuItem click event如何将自定义 RoutedEventArgs 与 MenuItem 单击事件一起使用
【发布时间】:2014-03-29 19:40:54
【问题描述】:

我是 C#/WPF 的新手,正在尝试在 MVVC 架构中开发应用程序。我有一些构成我的 DAL 的类(它们使用 EF 引用 localdb),并且我有一些构成 ViewController 的类。 ViewController 对象填充了一个使用 DAL 对象作为参数的方法,该方法查询 Db 以填充一些 ObservableCollections,这些 ObservableCollections 最终绑定到我的 UI 中的 DataGrids。 ViewController 对象使用事件绑定到 DAL 对象,这样每当 DAL 对象将更改写入 Db 时,ViewController 都会重新运行 update 方法,因此 UI 会重新填充新数据。

我想使用 MenuItem_click 事件来更改 Db,然后让 UI 反映这一点。使用现有的结构,我想我需要以某种方式将 DAL 对象传递给 MenuItem_click 处理程序,以便 ViewController 将被通知 Db 的更改并相应地更新。同样,如果我在 click 事件处理程序中创建了一个新的 DAL 对象,我需要传入 ViewController 对象,以便它可以绑定到新的 DAL 对象——所以同样的问题。

我无法弄清楚如何将其他参数传递给 MenuItem_click 处理程序。

我创建了一个派生的自定义 RoutedEventArgs 类(其中 DbSymbol 是 DAL 对象):

    public class ClearAllEventArgs : RoutedEventArgs
    {
        private DbSymbol _symbolDAL { get; set; }
        public DbSymbol symbolDAL { get { return _symbolDAL; } }

        public ClearAllEventArgs(RoutedEvent routedEvent, DbSymbol dbSymbol) : base(routedEvent)
        {
            this._symbolDAL = dbSymbol;
        }
    }

    private void clearAllDataMenuItem_Click(object sender, ClearAllRoutedEventArgs e)
    {
        MessageBoxResult confirmDelete= MessageBox.Show("This will remove all data from the database. Continue?", "Confirm", MessageBoxButton.YesNo, MessageBoxImage.Question);
        if (confirmDelete == MessageBoxResult.Yes)
        {
            e.symbolDAL.RemoveAll();
        }
    }

但我之前使用 XAML 连接事件处理程序(它使用 Click="ClearAllMenuItem_Click" 自动附加到 .Click 并神奇地自动生成了 RoutedEventArgs),我无法确切地知道幕后发生了什么自己用代码隐藏复制它,我认为这对于这样的事情是必要的。

这是我尝试过的:

            RoutedEvent MouseClickEvent = EventManager.RegisterRoutedEvent("Clear All", RoutingStrategy.Bubble, typeof(RoutedEventArgs), typeof(MenuItem));
            ClearAllEventArgs newClearAll = new ClearAllEventArgs(MouseClickEvent, symbolDAL);
            clearAllDataMenuItem.Click += clearAllDataMenuItem_Click(this, newClearAll);

这甚至不会编译,因为 clearAllDataMenuItem_Click 返回 void 类型,但 clearAllDataMenuItem.Click 需要 RoutedEventHandler。总的来说,我对事件相当陌生,所以请原谅我的无知。有人可以帮助我,或指出正确的方向吗?

谢谢!

【问题讨论】:

    标签: c# wpf events routedeventargs


    【解决方案1】:

    您可以与发件人一起做,而不是尝试在事件中执行此操作。 (我不确定您的 MenuItem 是如何连接的,但这应该会给您一个大致的概念。

    在您的情况下,发件人是一个 FrameworkElement,所有 FrameworkElements 都有一个 Tag 属性。

    所以在你的 XAML 中你做这样的事情:

    <MenuItem Tag="{Binding}"></MenuItem>
    

    如果你可以这样做:

    private void clearAllDataMenuItem_Click(object sender, RoutedEventArgs e)
    {
        var symbolDAL = (SymbolDAL)((FrameworkElement) sender).Tag;
    
        MessageBoxResult confirmDelete = MessageBox.Show("This will remove all data from the database. Continue?", "Confirm", MessageBoxButton.YesNo, MessageBoxImage.Question);
        if (confirmDelete == MessageBoxResult.Yes)
        {
            symbolDAL.RemoveAll();
        }
    }
    

    请务必添加错误处理,因为如果该标记不是您的对象或 null 将导致异常。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-08
      • 2014-12-28
      • 1970-01-01
      • 2017-11-09
      • 2021-05-25
      • 1970-01-01
      相关资源
      最近更新 更多