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

在 WPF 中使用 MVVM(Model-View-ViewModel)模式,可以让界面与业务逻辑清晰分离,提升代码的可维护性和可测试性。下面介绍如何在 C# WPF 项目中实现 MVVM 模式,从结构搭建到数据绑定和命令处理。
新建一个 WPF 应用程序后,建议按功能划分文件夹,使结构更清晰:
例如,创建一个简单的用户信息展示功能:
Models/User.cspublic class User
{
public string Name { get; set; }
public int Age { get; set; }
}ViewModels/MainViewModel.cs
using System.ComponentModel;
<p>public class MainViewModel : INotifyPropertyChanged
{
private string _name;
private int _age;</p><pre class="brush:php;toolbar:false;"><pre class="brush:php;toolbar:false;">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<Window x:Class="MvvmApp.Views.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MVVM 示例" Height="200" Width="300">
<StackPanel Margin="20">
<TextBlock Text="姓名:" />
<TextBox Text="{Binding Name, UpdateSourceTrigger=PropertyChanged}" />
<TextBlock Text="年龄:" Margin="0,10,0,0" />
<TextBox Text="{Binding Age, UpdateSourceTrigger=PropertyChanged}" />
</StackPanel>
</Window>在窗口加载时设置 DataContext:
MainWindow.xaml.cspublic partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
DataContext = new MainViewModel();
}
}这样,文本框会自动显示 ViewModel 中的值,并在用户输入时更新属性。
ViewModel 不应直接引用 UI 元素,通过 ICommand 实现按钮点击等交互。
添加一个“保存”命令到 ViewModel:
using System.Windows.Input;
<p>public class MainViewModel : INotifyPropertyChanged
{
// ... 其他属性</p><pre class="brush:php;toolbar:false;"><pre class="brush:php;toolbar:false;">public ICommand SaveCommand => new RelayCommand(Save);
private void Save()
{
MessageBox.Show($"保存用户:{Name}, 年龄:{Age}");
}
// 实现 INotifyPropertyChanged ...}
需要定义一个简单的 RelayCommand:
Commands/RelayCommand.csusing System;
using System.Windows.Input;
<p>public class RelayCommand : ICommand
{
private readonly Action _execute;
private readonly Func<bool> _canExecute;</p><pre class="brush:php;toolbar:false;"><pre class="brush:php;toolbar:false;">public RelayCommand(Action execute, Func<bool> canExecute = 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 中绑定命令:
<Button Content="保存" Command="{Binding SaveCommand}" Margin="0,10" />点击按钮时会调用 ViewModel 中的 Save 方法,完全解耦 UI 和逻辑。
大型应用中,可以使用 ViewModelLocator 或依赖注入容器(如 Microsoft.Extensions.DependencyInjection)统一管理 ViewModel 创建。
也可以通过 Messenger 或事件聚合器实现跨 ViewModel 通信,避免紧耦合。
基本上就这些。掌握属性通知、数据绑定和命令机制,就能在 WPF 中有效使用 MVVM 模式。不复杂但容易忽略细节,比如忘记设置 DataContext 或未正确触发 PropertyChanged。多练习几个小功能,很快就能上手。
以上就是C# 如何在 WPF 中使用 MVVM 模式_C# WPF MVVM 模式应用教程的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号