Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# mvvm使用viewmodel在自定义窗口中绑定自定义事件_C#_Wpf_Xaml_Mvvm_Caliburn.micro - Fatal编程技术网

C# mvvm使用viewmodel在自定义窗口中绑定自定义事件

C# mvvm使用viewmodel在自定义窗口中绑定自定义事件,c#,wpf,xaml,mvvm,caliburn.micro,C#,Wpf,Xaml,Mvvm,Caliburn.micro,我有一个我希望找到解决方案的场景,我有一个自定义的窗口类,我创建了一个事件,如下所示(为了简洁起见,我删除了一些代码) 我将MVVM与Calibutn.Micro一起使用,我有一个ShellViewModel和ShellView(ShellView继承自AeroWindow) 我想知道的是: 我应该如何正确地创建自定义事件,上述是否正确 然后如何绑定到视图模型中的“事件” 是否可以使用相同的事件方法将事件从一个视图模型冒泡到另一个视图模型(例如,我有一个ShellViewModel,它最初加载

我有一个我希望找到解决方案的场景,我有一个自定义的
窗口
类,我创建了一个事件,如下所示(为了简洁起见,我删除了一些代码)

我将MVVM与Calibutn.Micro一起使用,我有一个ShellViewModel和ShellView(ShellView继承自AeroWindow)

我想知道的是:

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

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

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

如何正确创建自定义事件,上述是否正确?

  • 我认为您上面所做的是正确的,或者您可以像往常一样添加事件处理程序
  • 如果您谈论的是自定义事件,您将在其中创建自己的事件,而不是类的内置事件,那么您实际上可以在类中创建一个自定义事件
然后如何绑定到视图模型中的所述“事件”

  • 我认为您不想绑定事件,您要做的是绑定命令。您可以尝试阅读有关ICommand、Relaycommand、, 授权命令。可以在中创建ICommand属性 viewmodel然后将其绑定到按钮的命令属性。那里 还有一些工具允许您绑定到事件,请尝试查看 对于某些提供EventToCommand的库
是否可以使用相同的事件方法将事件从一个视图模型冒泡到另一个视图模型(例如,我有一个ShellViewModel,它最初加载一个LoginViewMode(UserControl),然后再加载一个MainViewModel(UserControl),如果窗口上有一个名为Exit的事件,ShellViewModel是否可以订阅该事件并将其冒泡到加载的视图中,或者加载的视图是否应该订阅窗口事件)

  • 在这个场景中,如果涉及到两个viewmodel,因为您使用的是caliburn.micro,您可能需要检查
    . 这将允许您发布来自
    一个viewmodel并订阅另一个viewmodel。然后,一旦 如果调用publish,将通知所有订户

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

      如何正确创建自定义事件,上述是否正确?

      • 我认为您上面所做的是正确的,或者您可以像往常一样添加事件处理程序
      • 如果您谈论的是自定义事件,您将在其中创建自己的事件,而不是类的内置事件,那么您实际上可以在类中创建一个自定义事件
      然后如何绑定到视图模型中的所述“事件”

      • 我认为您不想绑定事件,您要做的是绑定命令。您可以尝试阅读有关ICommand、Relaycommand、, 授权命令。可以在中创建ICommand属性 viewmodel然后将其绑定到按钮的命令属性。那里 还有一些工具允许您绑定到事件,请尝试查看 对于某些提供EventToCommand的库
      是否可以使用相同的事件方法将事件从一个视图模型冒泡到另一个视图模型(例如,我有一个ShellViewModel,它最初加载一个LoginViewMode(UserControl),然后再加载一个MainViewModel(UserControl),如果窗口上有一个名为Exit的事件,ShellViewModel是否可以订阅该事件并将其冒泡到加载的视图中,或者加载的视图是否应该订阅窗口事件)

      • 在这个场景中,如果涉及到两个viewmodel,因为您使用的是caliburn.micro,您可能需要检查
        . 这将允许您发布来自
        一个viewmodel并订阅另一个viewmodel。然后,一旦 如果调用publish,将通知所有订户

      为什么要将退出事件绑定到viewmodel?视图模型是否需要知道您正在退出应用程序?退出只是一个示例,显然AeroWindow将处理退出,我还将创建其他事件,为什么要将退出事件绑定到视图模型?视图模型是否需要知道您正在退出应用程序?退出只是一个示例,显然AeroWindow将处理退出,我还需要创建和绑定其他事件
      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);
              }
          }
      }