答案:本文介绍了在WPF中通过MVVM模式实现界面与业务逻辑分离的方法,包括创建Models、ViewModels和Views三层结构,使用INotifyPropertyChanged接口实现数据绑定,通过RelayCommand处理用户命令,并在XAML中绑定DataContext与ICommand,从而实现解耦和可维护的代码架构。

在 WPF 中使用 MVVM(Model-View-ViewModel)模式,可以让界面与业务逻辑清晰分离,提升代码的可维护性和可测试性。下面介绍如何在 C# WPF 项目中实现 MVVM 模式,从结构搭建到数据绑定和命令处理。
创建基本项目结构
新建一个 WPF 应用程序后,建议按功能划分文件夹,使结构更清晰:
- Views:存放 XAML 界面文件(如 MainWindow.xaml、UserControl 等)
- ViewModels:存放 ViewModel 类,负责提供 View 所需的数据和命令
- Models:存放数据模型,表示业务实体
例如,创建一个简单的用户信息展示功能:
Models/User.cspublic class User
{
public string Name { get; set; }
public int Age { get; set; }
}ViewModels/MainViewModel.cs
using System.ComponentModel;public class MainViewModel : INotifyPropertyChanged { private string _name; private int _age;
public string Name { get => _name; set { _name = value; OnPropertyChanged(nameof(Name)); } } public int Age { get => _age; set { _age = value; OnPropertyChanged(nameof(Age)); } } public event PropertyChangedEventHandler PropertyChanged; protected virtual void OnPropertyChanged(string propertyName) { PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); }}
设置数据绑定
在 View 中绑定 ViewModel 的属性,让界面自动响应数据变化。
Views/MainWindow.xaml在窗口加载时设置 DataContext:
MainWindow.xaml.cspublic partial class MainWindow : Window { public MainWindow() { InitializeComponent(); DataContext = new MainViewModel(); } }这样,文本框会自动显示 ViewModel 中的值,并在用户输入时更新属性。
使用 ICommand 处理用户操作
ViewModel 不应直接引用 UI 元素,通过 ICommand 实现按钮点击等交互。
添加一个“保存”命令到 ViewModel:
using System.Windows.Input;public class MainViewModel : INotifyPropertyChanged { // ... 其他属性
public ICommand SaveCommand => new RelayCommand(Save); private void Save() { MessageBox.Show($"保存用户:{Name}, 年龄:{Age}"); } // 实现 INotifyPropertyChanged ...}
需要定义一个简单的 RelayCommand:
Commands/RelayCommand.csusing System; using System.Windows.Input;public class RelayCommand : ICommand { private readonly Action _execute; private readonly Func
_canExecute; public RelayCommand(Action execute, FunccanExecute = null) { _execute = execute; _canExecute = canExecute; } public bool CanExecute(object parameter) => _canExecute == null || _canExecute(); public void Execute(object parameter) => _execute(); public event EventHandler CanExecuteChanged { add { CommandManager.RequerySuggested += value; } remove { CommandManager.RequerySuggested -= value; } } }
在 XAML 中绑定命令:
点击按钮时会调用 ViewModel 中的 Save 方法,完全解耦 UI 和逻辑。
整合资源与导航(可选进阶)
大型应用中,可以使用 ViewModelLocator 或依赖注入容器(如 Microsoft.Extensions.DependencyInjection)统一管理 ViewModel 创建。
也可以通过 Messenger 或事件聚合器实现跨 ViewModel 通信,避免紧耦合。
基本上就这些。掌握属性通知、数据绑定和命令机制,就能在 WPF 中有效使用 MVVM 模式。不复杂但容易忽略细节,比如忘记设置 DataContext 或未正确触发 PropertyChanged。多练习几个小功能,很快就能上手。










