c# - mvvm 在自定义窗口中使用 viewmodel 绑定(bind)自定义事件

标签 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)

我想知道的是:
  • 我应该如何正确创建自定义事件,以上是否正确?
  • 然后我如何绑定(bind)到 View 模型中的“事件”
  • 是否可以使用相同的事件方法将事件从一个 View 模型冒泡到另一个 View 模型(例如,我有 ShellViewModel,它最初加载一个 LoginViewMode(UserControl),然后加载一个 MainViewModel(UserControl),如果我有一个事件名为 Exit 的窗口可以让 ShellViewModel 订阅它并将其冒泡到加载的 View ,或者加载的 View 是否订阅窗口事件)

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

    最佳答案

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

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

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

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

    是否可以使用相同的事件方法将事件从一个 View 模型冒泡到另一个 View 模型(例如,我有 ShellViewModel,它最初加载一个 LoginViewMode(UserControl),然后加载一个 MainViewModel(UserControl),如果我有一个事件名为 Exit 的窗口可以让 ShellViewModel 订阅它并将其冒泡到加载的 View ,或者加载的 View 是否订阅窗口事件)
  • 在这种情况下,涉及两个 View 模型,因为您使用的是 caliburn.micro,您可能需要检查
    EventAggregator .这将允许您从
    一个 View 模型并订阅另一个 View 模型。然后一旦
    发布被调用,所有订阅者将被通知。
  • 关于c# - mvvm 在自定义窗口中使用 viewmodel 绑定(bind)自定义事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32991511/

    相关文章:

    c# - Gzipped 内容不反射(reflect)输入

    c# - 是否可以使用具有一系列值的哈希表?

    c# - 如何为 DataGridComboBoxColumn WPF 绑定(bind)数组

    c# - 边框不会自动调整其内容

    c# - 缺少 UWP 样式触发器

    c# - 使用 Moq 模拟 C# 计时器

    c# - 编译器错误 CS0542 : member names cannot be the same as their enclosing type 的解决方法

    c# - WPF 文本字符 'g' 、 'q' 和其他字符在 TabItem 中被截断

    c# - 如何使用 Fiddler 调试来自任何应用程序(例如 C#/WPF 应用程序)的流量

    c# - 如何在 WPF 中按名称查找样式触发器嵌入元素?