日常生活的交流与学习

首页 新随笔 联系 管理

WPF MVVM(Model-View-ViewModel) 设计模式

在 WPF 应用程序中使用 MVVM(Model-View-ViewModel)设计模式的一部分,其中 ViewModel(TempModel)负责封装数据和业务逻辑,而 View(MainWindow.xaml)通过 DataBinding 与 ViewModel 进行交互。

Juster.Music\MainWindow.xaml

<Window
    x:Class="Juster.Music.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:local="clr-namespace:Juster.Music"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    Title="MainWindow"
    Width="800"
    Height="450"
    mc:Ignorable="d">
    <Grid>

        <Grid.RowDefinitions>
            <RowDefinition />
            <RowDefinition />
            <RowDefinition />
            <RowDefinition />
        </Grid.RowDefinitions>

        <StackPanel HorizontalAlignment="Center" Orientation="Horizontal">
            <TextBlock
                HorizontalAlignment="Center"
                VerticalAlignment="Center"
                Text="账号:" />
            <!-- - **数据绑定(Data Binding)**:TextBox控件的Text属性与ViewModel中的属性进行了双向数据绑定。
                    例如,`Text="{Binding Account,UpdateSourceTrigger=PropertyChanged}"`表示TextBox的文本内容会与ViewModel中的Account属性同步,
                    并且当Account属性发生变化时立即更新源。 -->
            <TextBox
                Name="TxtA"
                Width="300"
                Height="30"
                Text="{Binding Account,UpdateSourceTrigger=PropertyChanged}" />
        </StackPanel>

        <StackPanel
            Grid.Row="1"
            HorizontalAlignment="Center"
            Orientation="Horizontal">
            <TextBlock
                HorizontalAlignment="Center"
                VerticalAlignment="Center"
                Text="密码:" />
            <TextBox
                Name="TxtP"
                Width="300"
                Height="30"
                Text="{Binding PassWrold, Mode=TwoWay}" />
        </StackPanel>


        <!-- public List<string> LoginTypes -->
        <!-- - **ComboBox 绑定 ItemsSource**:ComboBox 的 ItemsSource 属性被绑定到 TempModel 类的 LoginTypes 属性,
            这样 ComboBox 的下拉列表项将由 LoginTypes 列表提供。 -->
        <ComboBox
            Grid.Row="2"
            Width="200"
            Height="25"
            ItemsSource="{Binding LoginTypes}" />

        <Button
            Name="BtnLogin"
            Grid.Row="3"
            Width="200"
            Height="30"
            Click="BtnLogin_Click"
            Content="Login" />
    </Grid>
</Window>

Juster.Music\MainWindow.xaml.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

namespace Juster.Music
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
            // DataContext设置:在构造函数中设置了窗口的数据上下文 DataContext = new TempModel();
            // 这样就使得MainWindow.xaml中的数据绑定可以找到对应的TempModel类实例进行绑定。
            DataContext = new TempModel();
        }

        private void BtnLogin_Click(object sender, RoutedEventArgs e)
        {
            string a = TxtA.Text;
            string p = TxtP.Text;

            if (a == "root" && p == "123")
            {
                MessageBox.Show("登录成功!");
            }
            else
            {
                MessageBox.Show("登录失败!");
            }
        }
    }
}

Juster.Music\TempModel.cs

using Juster.Common;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Juster.Music
{
    public class TempModel
    {
        //    - **自动属性和私有字段**:TempModel 类中定义了 Account、PassWrold 和 LoginTypes 三个属性,它们都有对应的私有字段,并提供了 get 和 set 访问器。这允许对这些属性进行读写操作以及数据绑定。
        private string _account;

        public string Account
        {
            get { return _account; }
            set
            {
                _account = value;
            }
        }

        private string _passwrold;

        public string PassWrold
        {
            get { return _passwrold; }
            set
            {
                _passwrold = value;
            }
        }

        private List<string> _loginTypes;

        public List<string> LoginTypes
        {
            get { return _loginTypes; }
            set { _loginTypes = value; }
        }



        //    - **构造函数**:TempModel 类的构造函数初始化了 Account 属性为"root",并且初始化 LoginTypes 为一个包含三种登录类型字符串的 List。
        public TempModel()
        {
            Account = "root";
            LoginTypes = new List<string>();
            LoginTypes.Add("手机号登录");
            LoginTypes.Add("账号密码登录");
            LoginTypes.Add("二维码登录");
        }
    }
}

posted on 2024-01-25 19:12  lazycookie  阅读(38)  评论(0编辑  收藏  举报