首页 > 其他分享 >WPF中MVVM的应用举例

WPF中MVVM的应用举例

时间:2024-10-14 23:19:24浏览次数:10  
标签:绑定 MVVM ViewModel 举例 WPF public View

WPF(Windows Presentation Foundation)是微软开发的用于创建用户界面的框架,而MVVM(Model-View-ViewModel)模式是一种分离前端UI逻辑与后台业务逻辑的方法。在WPF中使用MVVM模式可以提高代码的可维护性、可测试性和可扩展性。在这篇文章中,我们将深入探讨WPF中的MVVM模式,并通过具体的代码示例来展示其应用。

在这里插入图片描述

一、MVVM 模式概述

在这里插入图片描述

1.1 模型(Model)

Model 是应用程序的业务逻辑层,负责数据的处理、验证和操作。它通常与数据库或网络服务交互,并且应该是独立于 View 和 ViewModel 的。因此,Model 层不应该包含与 UI 相关的代码。

1.2 视图(View)

View 是用户界面层,负责数据的显示和用户交互。它通常是由 XAML 文件定义的。View 通过数据绑定(Data Binding)与 ViewModel 进行交互,而不是直接与 Model 交互。View 中不应该包含业务逻辑,而是通过绑定与 ViewModel 进行数据和命令的交互。

1.3 视图模型(ViewModel)

ViewModel 是 MVVM 的核心,充当 View 和 Model 之间的桥梁。它通常包含 View 的状态、操作和命令。ViewModel 实现了 INotifyPropertyChanged 接口,以支持数据绑定的通知机制,这样当 ViewModel 的属性发生变化时,View 可以自动更新。

二、WPF 中 MVVM 模式的优势

在这里插入图片描述

  • 分离关注点:通过将 UI 和业务逻辑分离,开发者可以专注于各自的职责,这使得代码更易于理解和维护。
  • 可测试性:业务逻辑被移到了 ViewModel 中,并且不依赖于具体的 UI,使得逻辑单元更容易进行自动化测试。
  • 可维护性和可扩展性:通过使用绑定和命令,UI 变化不需要改变业务逻辑代码,从而提高了代码的可维护性和可扩展性。

三、WPF 中 MVVM 模式的应用示例

接下来,我们将通过一个具体的示例来展示如何在 WPF 中实现 MVVM 模式。我们将创建一个简单的应用程序,允许用户在文本框中输入姓名,然后在另一个文本框中显示问候语。

3.1 创建项目

首先,打开 Visual Studio,并创建一个新的 WPF 应用程序项目。

3.2 创建 Model 类

Model 类可以是简单的数据类,只包含姓名属性。以下是一个示例:

public class UserModel
{
    public string Name { get; set; }
}
3.3 创建 ViewModel 类

ViewModel 类用于管理数据和业务逻辑。我们将在其中实现 INotifyPropertyChanged 接口,以便当属性变化时通知 View 进行更新。

using System.ComponentModel;
using System.Runtime.CompilerServices;

public class UserViewModel : INotifyPropertyChanged
{
    private UserModel _userModel;
    private string _greeting;

    public UserViewModel()
    {
        _userModel = new UserModel();
    }

    public string Name
    {
        get => _userModel.Name;
        set
        {
            _userModel.Name = value;
            OnPropertyChanged();
            UpdateGreeting();
        }
    }

    public string Greeting
    {
        get => _greeting;
        private set
        {
            _greeting = value;
            OnPropertyChanged();
        }
    }

    private void UpdateGreeting()
    {
        Greeting = $"Hello, {_userModel.Name}!";
    }
    
    public event PropertyChangedEventHandler PropertyChanged;
    
    protected void OnPropertyChanged([CallerMemberName] string propertyName = null)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }
}

在这段代码中,UserViewModel 通过 INotifyPropertyChanged 通知 View 数据的变化。Name 属性的更改会自动更新 Greeting 属性。

3.4 创建 View

View 是 XAML 文件,负责定义用户界面。在 MainWindow.xaml 中,添加以下代码:

<Window x:Class="MVVMDemo.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        mc:Ignorable="d"
        Title="MVVM Demo" Height="200" Width="400">
    <Grid>
        <StackPanel Margin="10">
            <TextBox Text="{Binding Name, UpdateSourceTrigger=PropertyChanged}" 
                     Width="200" Height="30" Margin="0,0,0,10"/>
            <TextBlock Text="{Binding Greeting}" Width="200" Height="30"/>
        </StackPanel>
    </Grid>
</Window>

在 XAML 中,我们通过 DataContext 进行数据绑定。TextBoxText 属性绑定到 ViewModel 的 Name 属性,TextBlockText 绑定到 Greeting 属性。

3.5 将 ViewModel 绑定到 View

在 MainWindow.xaml.cs 中,将 ViewModel 绑定到 View 的 DataContext。

public partial class MainWindow : Window
{
    private UserViewModel _viewModel;

    public MainWindow()
    {
        InitializeComponent();
        _viewModel = new UserViewModel();
        this.DataContext = _viewModel;
    }
}

四、扩展 MVVM 应用

在这里插入图片描述

以上是一个简单的 MVVM 实例。为了更好地理解 MVVM 模式,我们可以进一步扩展这个示例,包括命令的使用、数据验证以及与其他服务(如数据库或网络服务)交互。

4.1 使用命令

命令是 MVVM 中用于替代事件处理的一种方式。通过使用命令,我们可以将用户交互(如按钮点击)与业务逻辑分离。MVVM 提供了 ICommand 接口用于实现命令。

以下是一个简单的命令实现:

using System;
using System.Windows.Input;

public class RelayCommand : ICommand
{
    private readonly Action<object> _execute;
    private readonly Func<object, bool> _canExecute;

    public event EventHandler CanExecuteChanged
    {
        add => CommandManager.RequerySuggested += value;
        remove => CommandManager.RequerySuggested -= value;
    }

    public RelayCommand(Action<object> execute, Func<object, bool> canExecute = null)
    {
        _execute = execute;
        _canExecute = canExecute;
    }

    public bool CanExecute(object parameter)
    {
        return _canExecute == null || _canExecute(parameter);
    }

    public void Execute(object parameter)
    {
        _execute(parameter);
    }
}

然后,我们可以在 UserViewModel 中创建命令:

public ICommand ShowGreetingCommand { get; }

public UserViewModel()
{
    _userModel = new UserModel();
    ShowGreetingCommand = new RelayCommand(
        p => UpdateGreeting(),
        p => !string.IsNullOrWhiteSpace(Name)
    );
}

在 XAML 中绑定命令:

<Button Content="Show Greeting" Command="{Binding ShowGreetingCommand}" Width="100" Height="30" />

使用命令后,Show Greeting 按钮只有在 Name 属性不为空时才可用。

五、总结

MVVM 模式在 WPF 应用程序中的应用,可以极大地提高代码的组织性和可维护性。通过分离 UI、业务逻辑和数据模型,我们创建了一个清晰、可测试和可扩展的架构。在实际项目中,使用 MVVM 模式可以帮助开发者更高效地合作,使应用程序更易于维护和扩展。

在实施过程中,理解数据绑定、命令模式和通知机制是使用 MVVM 模式的关键。熟练掌握这些技术将帮助开发者在现代软件开发中更高效地使用 WPF 和其他基于 XAML 的技术。

print("拥抱新技术才是王道!")

关注我,不迷路,共学习,同进步

关注我,不迷路,共学习,同进步

标签:绑定,MVVM,ViewModel,举例,WPF,public,View
From: https://blog.csdn.net/sixpp/article/details/142931454

相关文章

  • WPF中Resx文件中添加Byte[]
    参考:https://learn.microsoft.com/zh-tw/dotnet/api/system.resources.resxresourcewriter.generate?view=windowsdesktop-8.0&viewFallbackFrom=netcore-3.1代码实现:staticvoidMain(string[]args){using(ResXResourceWriterresWriter=newResXResourceWr......
  • WPF - 项目样例
    WPF-项目样例 1. 创建项目:参考:https://www.cnblogs.com/1285026182YUAN/p/18462396 2. 修改App.xaml<Applicationx:Class="ModelFileMigrate.App"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns......
  • wpf 下拉框添加选项中删除数据
    需要根据实际需求在按钮的对应事件或者Command中添加逻辑<StyleTargetType="ComboBox"x:Key="DeleteComboBoxStyle"><SetterProperty="ItemContainerStyle"><Setter.Value><!--ComBoxItem--><......
  • [WPF] 可选择的TextBlock,正则匹配高亮显示
    实现TextBlock控件像TextBox一样支持选择文本,又保留TextBlock显示省略号等特性,找不到参考文献了,抱歉。下面演示基于可选择TextBlock实现的效果: 代码已上传至https://gitee.com/Pumbaa_Peng/textbook-demo.git。1<pp:ChromeWindowx:Class="TextBlockDemo.MainWind......
  • WPF 性能优化-列表控件性能
    下面记录几种针对大数据列表控件性能的增强特性,WPF所有继承自ItemsControl的控件(列表控件)都支持这些增强特性,包括ListBox、ComboBox、ListView、TreeView以及DataGrid。一、虚拟化WPF列表控件所提供的最重要的功能就是UI虚拟化。UI虚拟化是列表只为可见区域中能显示的项创建容器......
  • WPF开发用户控件、用户控件属性依赖DependencyProperty实现双向绑定、以及自定义实现C
    1、新建了一个用户控件,里面画了一个实心圆,以及一个文本控件的组合,当作我要实验使用的用户控件(TestUserControl)。 2、在主窗体里面进行引用,可以看到引用以后,会在工具箱上显示新增的用户控件3、为了测试方便,我直接在先前的Lo'gin页面直接进行添加该用户控件,效果如下。 4、......
  • WPF 动画-VisualStateManager
    动画状态-VisualStateManagerVisualStateManager控件可以通过VisualState来定义控件的不同动画状态,然后在C#代码中合适地方,使用VisusalStateManager.GoToState()或VisualStateManager.GoToElementState()方法来切换到对应的状态,从而实现样式的切换。一、用法介绍1、关键成员......
  • WPF 等距布局
    本文告诉大家如何使用WPF的自定义布局做等距布局实际做的效果很简单,因为在开发我容易就用到了等距的控件。等距控件就是在指定的宽度下,平均把控件放在水平的地方,这样相等于StackPanel的水平,但是没有做水平压缩。在这个控件,无论在水平放多少个控件,都会在相同的高度把他们放下。......
  • 2019-7-12-wpf-VisualBrush-已知问题
    titleauthordateCreateTimecategorieswpfVisualBrush已知问题lindexi2019-7-1221:7:41+08002018-2-1317:23:3+0800WPF本文告诉大家,visualBrush已知bug,希望大家使用VisualBrush时可以知道如果把VisualBrush绑定的是在元素加入到视觉树前,那么在元素加入到视觉树之后移除......
  • WPF Image display webp via BitMapImgae BeginInit UriSource EndInit in MVVM
    privatevoidGenenerateBitMapImageViaUrl(stringurl){BitmapImagebmi=newBitmapImage();bmi.BeginInit();bmi.UriSource=newUri(url,UriKind.RelativeOrAbsolute);bmi.EndInit();if(bmi.CanFreeze){bmi.Freeze();}......