📜  MVVM –事件

📅  最后修改于: 2020-11-19 05:26:35             🧑  作者: Mango


事件是一种编程构造,可对状态变化做出反应,通知已注册通知的所有端点。首先,事件用于通过鼠标和键盘通知用户输入,但是它们的用途不限于此。每当检测到状态更改时,也许当对象已加载或初始化时,都可以触发事件以警告任何感兴趣的第三方。

  • 在使用MVVM(Model-View-ViewModel)设计模式的WPF应用程序中,视图模型是负责处理应用程序的表示逻辑和状态的组件。

  • 视图的代码隐藏文件不应包含任何代码来处理从任何用户界面(UI)元素(例如Button或ComboBox)引发的事件,也不应包含任何特定于域的逻辑。

  • 理想情况下,视图的背后代码仅包含调用InitializeComponent方法的构造函数,还可能包含一些其他代码以控制或与视图层交互,而这些层在XAML中难以表达或效率低下,例如复杂的动画。

让我们看一下应用程序中按钮单击事件的简单示例。以下是MainWindow.xaml文件的XAML代码,在其中您将看到两个按钮。


    
    
       
   
    
    
      
          
      
         
      
         
       
    

    
       
          
          
       
        
       
          
            
             
             
         
            
         
                
         
      
        
       
         
       
        
    


您可以看到上面的XAML文件中没有使用按钮Click属性,但是当按下按钮时,Command和CommandParameter属性用于加载不同的视图。现在,您需要在MainWindowViewModel.cs文件中定义命令实现,而不是在View文件中定义。以下是完整的MainWindowViewModel实现。

using MVVMHierarchiesDemo.ViewModel; 
using MVVMHierarchiesDemo.Views; 

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks;

namespace MVVMHierarchiesDemo { 

   class MainWindowViewModel : BindableBase { 
    
      public MainWindowViewModel() { 
         NavCommand = new MyICommand(OnNav); 
      } 

      private CustomerListViewModel custListViewModel = new CustomerListViewModel(); 
      private OrderViewModel orderViewModelModel = new OrderViewModel();

      private BindableBase _CurrentViewModel; 
        
      public BindableBase CurrentViewModel { 
         get { return _CurrentViewModel; } 
         set { SetProperty(ref _CurrentViewModel, value); } 
      } 
        
      public MyICommand NavCommand { get; private set; }

      private void OnNav(string destination) { 
        
         switch (destination) { 
            case "orders": 
               CurrentViewModel = orderViewModelModel; 
               break; 
            case "customers":
               default: 
               CurrentViewModel = custListViewModel; 
               break; 
         } 
      } 
   }
}

从BindableBase类派生所有ViewModel。编译并执行上述代码后,您将看到以下输出。

MVVM事件MainWindow1

如您所见,我们在MainWindow上仅添加了两个按钮和一个CurrentViewModel。现在,如果单击任何按钮,它将导航到该特定视图。让我们单击“客户”按钮,您将看到显示了CustomerListView。

MVVM事件MainWindow2

我们建议您以逐步的方法执行上面的示例,以更好地理解。