我是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。我对一般事件都很新,所以请原谅我的无知。有人可以帮忙,还是指出我正确的方向?
谢谢!
答案 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,则会导致异常。