mvvm使用viewmodel绑定自定义窗口中的自定义事件

时间:2015-10-07 11:52:31

标签: c# wpf xaml mvvm caliburn.micro

我有以下场景,我希望找到一个解决方案,我有一个自定义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.Micro,我有一个ShellViewModel和ShellView(ShellView继承自AeroWindow)

我想知道的是:

  • 我应该如何正确创建自定义事件,上述是否正确?
  • 我如何绑定到所说的"事件"在视图模型中
  • 可以使用相同的事件方法将事件从一个视图模型冒泡到另一个视图模型(例如,我有ShellViewModel,它最初加载一个LoginViewMode(UserControl),然后加载一个MainViewModel(UserControl),如果我有一个名为Exit的Window上的事件可以ShellViewModel订阅它并将其冒泡到加载的视图,或者加载的视图是否订阅了窗口事件。

我知道这是一些问题,但它们都与同一个问题有关,我希望有人可以提供答案。

1 个答案:

答案 0 :(得分:1)

让我试着回答你的每个问题

我应该如何正确创建自定义事件,以上是否正确?

  • 我认为您上面所做的是正确的,或者您可以像往常一样添加事件处理程序。
  • 如果您正在谈论自定义事件,除了课程的内置事件之外,您将创建自己的事件,您实际上可以在您的课程中创建delegate and an event

我如何绑定到视图模型中的“事件”

  • 我认为你不想绑定事件,你想要做的是绑定命令。您可以尝试阅读有关ICommand,Relaycommand, DelegateCommand。您可以在自己的位置创建ICommand属性 然后将viewmodel绑定到按钮的Command属性。那里 也是一些允许你绑定到事件,试图看的工具 对于一些提供EventToCommand
  • 的库

可以使用相同的事件方法将事件从一个视图模型冒泡到另一个视图模型(例如,我有ShellViewModel,它最初加载一个LoginViewMode(UserControl),然后加载一个MainViewModel(UserControl),如果我在Window上有一个名为Exit的事件,那么ShellViewModel可以订阅它并将其冒泡到加载的视图,或者加载的视图是否订阅窗口事件

  • 在这种情况下,涉及两个viewmodel,因为您使用的是caliburn.micro,您可能需要查看
    EventAggregator。这将允许您从中发布事件 一个viewmodel并在另一个viewmodel上订阅。然后一旦 调用publish,将通知所有订阅者。