【问题标题】:mvvm binding custom event in custom window with viewmodelmvvm 在自定义窗口中使用 viewmodel 绑定自定义事件
【发布时间】:2015-10-07 11:52:30
【问题描述】:

我希望找到以下解决方案,我有一个自定义 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),如果我有Window 上的一个名为 Exit 的事件可以让 ShellViewModel 订阅该事件并将其冒泡到加载的视图中,或者加载的视图是否应该订阅窗口事件)

我知道这是很多问题,但它们都与同一件事有关,我希望有人能提供答案。

【问题讨论】:

  • 为什么要将退出事件绑定到视图模型?视图模型是否需要知道您正在退出应用程序?
  • exit 只是一个例子,很明显 AeroWindow 会处理退出,还有其他我想要创建和绑定的事件

标签: c# wpf xaml mvvm caliburn.micro


【解决方案1】:

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

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

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

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

  • 我不认为你想绑定事件,你想做的是绑定命令。您可以尝试阅读有关 ICommand、Relaycommand、 委托指挥。您可以在您的 viewmodel 然后将其绑定到按钮的 Command 属性。那里 还有一些工具可以让你绑定事件,试试看 对于一些提供 EventToCommand 的库

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

  • 在这种涉及两个视图模型的场景中,由于您使用的是 caliburn.micro,因此您可能需要查看
    EventAggregator。这将允许您从
    发布事件 一个视图模型并订阅另一个视图模型。那么一旦
    发布被调用,所有订阅者都会收到通知。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-09-07
    • 2015-02-15
    • 2013-01-10
    • 1970-01-01
    • 1970-01-01
    • 2010-10-20
    • 1970-01-01
    • 2013-02-12
    相关资源
    最近更新 更多