C# WPF入门学习主线篇(三十二)—— 创建Model、View和ViewModel

37 篇文章 4 订阅
20 篇文章 0 订阅

C# WPF入门学习主线篇(三十二)—— 创建Model、View和ViewModel

在这里插入图片描述

在前一篇文章中,我们介绍了MVVM(Model-View-ViewModel)模式的基本概念。本篇将深入探讨如何在实际开发中创建Model、View和ViewModel,并通过一个具体示例来演示它们的交互和实现。

一、创建Model

Model表示应用程序的核心数据和业务逻辑。在MVVM模式中,Model应尽量保持独立,不依赖于UI。以下是一个简单的Model示例:

public class Employee
{
    public string Name { get; set; }
    public int Age { get; set; }
    public string Position { get; set; }
}

二、创建View

View表示用户界面,通过XAML定义。View与ViewModel通过数据绑定进行交互,而不直接访问Model。以下是一个简单的View示例:

<Window x:Class="WpfApp.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:WpfApp"
        Title="MVVM Demo" Height="200" Width="300">
    <Grid>
        <StackPanel>
            <TextBox Text="{Binding Name, UpdateSourceTrigger=PropertyChanged}" FontSize="16" Margin="10"/>
            <TextBox Text="{Binding Age, UpdateSourceTrigger=PropertyChanged}" FontSize="16" Margin="10"/>
            <TextBox Text="{Binding Position, UpdateSourceTrigger=PropertyChanged}" FontSize="16" Margin="10"/>
            <Button Content="Update" Command="{Binding UpdateCommand}" FontSize="16" Margin="10"/>
        </StackPanel>
    </Grid>
</Window>

三、创建ViewModel

ViewModel负责从Model获取数据,并将这些数据提供给View,同时处理用户在View上的交互。ViewModel通常实现INotifyPropertyChanged接口,以便在数据变化时通知View更新UI。

1. 实现INotifyPropertyChanged接口

首先,我们需要一个辅助类来实现命令绑定。以下是一个简单的RelayCommand类:

using System;
using System.Windows.Input;

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

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

    public bool CanExecute(object parameter) => _canExecute == null || _canExecute(parameter);

    public void Execute(object parameter) => _execute(parameter);

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

2. 创建EmployeeViewModel

然后,我们创建一个EmployeeViewModel类来封装Employee数据,并实现数据绑定和命令绑定:

using System.ComponentModel;
using System.Windows.Input;

public class EmployeeViewModel : INotifyPropertyChanged
{
    private Employee _employee;

    public EmployeeViewModel()
    {
        _employee = new Employee { Name = "John Doe", Age = 30, Position = "Software Developer" };
        UpdateCommand = new RelayCommand(UpdateEmployee);
    }

    public string Name
    {
        get => _employee.Name;
        set
        {
            if (_employee.Name != value)
            {
                _employee.Name = value;
                OnPropertyChanged(nameof(Name));
            }
        }
    }

    public int Age
    {
        get => _employee.Age;
        set
        {
            if (_employee.Age != value)
            {
                _employee.Age = value;
                OnPropertyChanged(nameof(Age));
            }
        }
    }

    public string Position
    {
        get => _employee.Position;
        set
        {
            if (_employee.Position != value)
            {
                _employee.Position = value;
                OnPropertyChanged(nameof(Position));
            }
        }
    }

    public ICommand UpdateCommand { get; }

    private void UpdateEmployee(object parameter)
    {
        Name = "Updated Name";
        Age = 35;
        Position = "Updated Position";
    }

    public event PropertyChangedEventHandler PropertyChanged;

    protected void OnPropertyChanged(string propertyName)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }
}

3. 绑定ViewModel到View

在View的代码隐藏文件中,我们将ViewModel实例绑定到View的DataContext。

using System.Windows;

namespace WpfApp
{
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
            this.DataContext = new EmployeeViewModel();
        }
    }
}

四、完整代码示例

MainWindow.xaml

<Window x:Class="WpfApp.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:WpfApp"
        Title="MVVM Demo" Height="200" Width="300">
    <Grid>
        <StackPanel>
            <TextBox Text="{Binding Name, UpdateSourceTrigger=PropertyChanged}" FontSize="16" Margin="10"/>
            <TextBox Text="{Binding Age, UpdateSourceTrigger=PropertyChanged}" FontSize="16" Margin="10"/>
            <TextBox Text="{Binding Position, UpdateSourceTrigger=PropertyChanged}" FontSize="16" Margin="10"/>
            <Button Content="Update" Command="{Binding UpdateCommand}" FontSize="16" Margin="10"/>
        </StackPanel>
    </Grid>
</Window>

MainWindow.xaml.cs

using System.Windows;

namespace WpfApp
{
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
            this.DataContext = new EmployeeViewModel();
        }
    }
}

Employee.cs

public class Employee
{
    public string Name { get; set; }
    public int Age { get; set; }
    public string Position { get; set; }
}

EmployeeViewModel.cs

using System.ComponentModel;
using System.Windows.Input;

public class EmployeeViewModel : INotifyPropertyChanged
{
    private Employee _employee;

    public EmployeeViewModel()
    {
        _employee = new Employee { Name = "John Doe", Age = 30, Position = "Software Developer" };
        UpdateCommand = new RelayCommand(UpdateEmployee);
    }

    public string Name
    {
        get => _employee.Name;
        set
        {
            if (_employee.Name != value)
            {
                _employee.Name = value;
                OnPropertyChanged(nameof(Name));
            }
        }
    }

    public int Age
    {
        get => _employee.Age;
        set
        {
            if (_employee.Age != value)
            {
                _employee.Age = value;
                OnPropertyChanged(nameof(Age));
            }
        }
    }

    public string Position
    {
        get => _employee.Position;
        set
        {
            if (_employee.Position != value)
            {
                _employee.Position = value;
                OnPropertyChanged(nameof(Position));
            }
        }
    }

    public ICommand UpdateCommand { get; }

    private void UpdateEmployee(object parameter)
    {
        Name = "Updated Name";
        Age = 35;
        Position = "Updated Position";
    }

    public event PropertyChangedEventHandler PropertyChanged;

    protected void OnPropertyChanged(string propertyName)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }
}

RelayCommand.cs

using System;
using System.Windows.Input;

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

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

    public bool CanExecute(object parameter) => _canExecute == null || _canExecute(parameter);

    public void Execute(object parameter) => _execute(parameter);

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

五、总结

通过本文,我们详细介绍了如何在WPF中创建Model、View和ViewModel,并通过一个具体示例演示了它们的交互和实现。MVVM模式通过将UI和业务逻辑分离,提高了代码的可维护性和可测试性,是WPF开发中的一种重要架构模式。希望本文能帮助你更好地理解和应用MVVM模式,提高WPF开发的水平。

  • 21
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
WPF(Windows Presentation Foundation)是一种用于创建Windows应用程序的界面开发技术,其基于.NET Framework平台,并使用C#编程语言进行开发。WPF提供了一套强大的工具和框架,使开发人员能够轻松创建富有吸引力、功能丰富的用户界面。 WPF与传统的Windows Forms相比具有许多优势。首先,WPF支持更加灵活和现代化的用户界面设计,可以轻松地创建透明、动画和多媒体效果等视觉效果。其次,WPF具有更好的分离性,允许开发人员将界面逻辑与业务逻辑进行分离,使代码更加清晰和易于维护。此外,WPF还支持数据绑定和样式模板等功能,使界面开发更加高效和可重用。 在使用WPF进行编程时,首先需要了解XAML(Extensible Application Markup Language)语言,它用于定义WPF界面元素和布局。然后,使用C#语言编写代码逻辑,处理用户交互、数据绑定、事件处理等方面的功能。在WPF中,可以通过使用命令模式和MVVM(Model-View-ViewModel)架构来组织和管理代码,以实现更好的代码分离性。 另外,WPF提供了丰富的控件库,开发人员可以使用这些控件来构建各种功能和复杂的界面。同时,WPF还支持自定义控件的开发,开发人员可以根据具体需求创建自己的控件。 总之,WPF是一种强大的界面开发技术,可以帮助开发人员创建出具有丰富功能和吸引力的Windows应用程序。同时,使用C#语言进行开发可以使开发过程更加高效和灵活。无论是初学者还是有经验的开发人员,都可以从WPF编程宝典中学习到丰富的知识和技巧,提高自己的WPF编程能力。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值