0

我是 C# / WPF 的新手,试图在 MVVC 架构中开发应用程序。我有一些构成我的 DAL 的类(它们使用 EF 引用 localdb),并且我有一些构成 ViewController 的类。ViewController 对象填充了一个使用 DAL 对象作为参数的方法,该方法查询 Db 以填充一些 ObservableCollections,这些 ObservableCollections 最终绑定到我的 UI 中的 DataGrids。ViewController 对象使用事件绑定到 DAL 对象,这样每当 DAL 对象将更改写入 Db 时,ViewController 就会重新运行更新方法,因此 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。总的来说,我对事件相当陌生,所以请原谅我的无知。有人可以帮忙,或者指出我正确的方向吗?

谢谢!

4

1 回答 1

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 它将导致异常。

于 2014-03-29T20:45:00.497 回答