如何使用MenuItem单击事件自定义RoutedEventArgs

时间:2014-03-29 19:40:54

标签: c# wpf events routedeventargs

我是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会自动与Click =" ClearAllMenuItem_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。我对一般事件都很新,所以请原谅我的无知。有人可以帮忙,还是指出我正确的方向?

谢谢!

1 个答案:

答案 0 :(得分:0)

您可以使用发件人执行此操作,而不是尝试在事件中执行此操作。 (我不确定你的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,则会导致异常。