我有以下场景,我希望找到一个解决方案,我有一个自定义的Window
类,我已经创建了一个事件如下(我已经删除了一些简短的代码)
public class AeroWindow : Window
{
public delegate void SystemMenuEventHandler(object sender);
public event SystemMenuEventHandler Exit;
...
public override void OnApplyTemplate()
{
...
var exitButton = this.GetTemplateChild("SM_ExitButton") as Button;
if (exitButton != null)
{
exitButton.Click += (sender, args) => { this.OnExit(); };
}
}
protected virtual void OnExit()
{
if (this.Exit != null)
{
this.Exit(this);
}
}
}
我正在使用MVVM与Calibutn。微和我有一个ShellViewModel和ShellView (ShellView继承自AeroWindow)
我想知道的是:
- 我应该如何正确地创建自定义事件,是上述正确的吗?
- 如何在视图模型中绑定"事件"呢
- 事件的相同方法可用于从一个视图模型到另一个气泡事件(例如,我有ShellViewModel,最初加载LoginViewMode (UserControl),并反过来加载MainViewModel (UserControl),如果我有一个事件的窗口称为
Exit
可以ShellViewModel订阅,并将其泡到加载视图或加载视图订阅窗口事件)
我知道这是许多问题,但它们都与同一件事有关,我希望有人能提供一个答案。
让我试着回答你的每一个问题
我应该如何正确地创建自定义事件,是上述正确的吗?
- 我认为你上面做的是正确的,或者你可以像往常一样添加一个事件处理程序。
- 如果你说的是自定义事件,除了类的内置事件之外,你还可以创建自己的事件,你可以在你的类中创建一个委托和一个事件。
如何绑定到视图模型中的事件
- 我不认为你想绑定事件,你想做的是绑定命令。你可以尝试阅读iccommand, Relaycommand,DelegateCommand。类中创建一个iccommand属性viewmodel然后将其绑定到按钮的Command属性。在那里还有一些工具可以让你绑定到事件,试着看看对于一些提供EventToCommand的库
事件的相同方法可用于从一个视图模型到另一个气泡事件(例如,我有ShellViewModel,最初加载LoginViewMode (UserControl),并依次加载MainViewModel (UserControl),如果我有一个窗口上的事件称为Exit可以ShellViewModel订阅,并将其泡到加载视图或应该加载视图订阅窗口事件)
-
在这个场景中,涉及到两个视图模型,因为您使用的是calibre。Micro,你可能想检查一下
EventAggregator。这将允许您从
发布事件。一个视图模型和另一个视图模型的订阅。然后一旦