📅  最后修改于: 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。编译并执行上述代码后,您将看到以下输出。
如您所见,我们在MainWindow上仅添加了两个按钮和一个CurrentViewModel。现在,如果单击任何按钮,它将导航到该特定视图。让我们单击“客户”按钮,您将看到显示了CustomerListView。
我们建议您以逐步的方法执行上面的示例,以更好地理解。