首页 > 其他分享 >Wpf 第三方Mvvm包(mvvmLight/Microsoft.Toolkit.Mvvm/CommunityToolkit.Mvvm)

Wpf 第三方Mvvm包(mvvmLight/Microsoft.Toolkit.Mvvm/CommunityToolkit.Mvvm)

时间:2023-11-29 16:22:42浏览次数:34  
标签:CommunityToolkit Mvvm get currentTime Toolkit set wendu public

十年河东,十年河西,莫欺少年穷

学无止境,精益求精 

mvvmLight 和 Microsoft.Toolkit.Mvvm 已被Nuget弃用且不再更新,在此不作说明

CommunityToolkit.Mvvm 是 NetCore 版本引用包,详情参考:WPF MVVM框架:CommunityToolkit.Mvvm包使用介绍

1、wpf项目中使用 CommunityToolkit.Mvvm (NetCore3.1以上)

1.1、实现的界面

 界面中包含一个进度条,2个文本框,2个按钮,

靠上的文本框显示viewModel中的一个属性值,和进度条实现双向绑定,另一个文本框显示实时时间。

2个按钮,靠上的执行无参函数,靠下的执行有参函数

xaml如下:

<Window x:Class="WpfApp2.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"
        xmlns:local="clr-namespace:WpfApp2"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800">
    <Window.Resources>
        <Style TargetType="Button" x:Key="baseStl">
            <Setter Property="Width" Value="200"/>
            <Setter Property="Height" Value="80"/>
            <Setter Property="Background" Value="Yellow"/>
            <Setter Property="FontSize" Value="22"/>

        </Style>
        <Style TargetType="Button" x:Key="Butn" BasedOn="{StaticResource baseStl}">
            <Setter Property="Content" Value="Btu"/>

        </Style>
    </Window.Resources>
    <Grid>
        <StackPanel>
            <Slider x:Name="slider" Maximum="100" Minimum="0"  Margin="5" Value="{Binding wendu}"  ></Slider>
            <TextBox x:Name="textbox1" Margin="5" Height="30" Text="{Binding wendu}" />
            <Button x:Name="button" Style="{StaticResource Butn}"  Command="{Binding BtnCommand}" Width="300" Height="100" Content="执行无参数方法" />

            <Button x:Name="button2" Style="{StaticResource Butn}"  Command="{Binding Btn2Command}" CommandParameter="{Binding ElementName=timetextbox,Path=Text,Mode=TwoWay}" Width="300" Height="100" Content="执行带参数的方法" />

            <TextBox x:Name="timetextbox" Margin="5" Height="30" Text="{Binding CurrentTime}"  VerticalAlignment="Center"/>
        </StackPanel>
    </Grid>
</Window>
View Code

1.2、声明数据上下文

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

1.3、viewModel如下

    public class MainWindowModel : ObservableObject
    {
        public IRelayCommand BtnCommand { get; set; }
        public IRelayCommand<string> Btn2Command { get; set; }
        
        public MainWindowModel()
        {
            //进度条模式为20
            this.wendu = 20;
            StartUpdateTimer();
            BtnCommand = new RelayCommand(DoBtnCommand);
            Btn2Command = new RelayCommand<string>(DoBtn2Command);
             
        }
        public void DoBtn2Command(string param)
        {
            this.wendu = 50;
            MessageBox.Show(param);
        }

        public void DoBtnCommand()
        {
            this.wendu = 88;
            MessageBox.Show("进度条的值修改为88,进度条向前动了。");
        }
        private ushort _wendu;
        public ushort wendu
        {
            get { return this._wendu; }
            set
            {
                this._wendu = value;
                this.OnPropertyChanged();
            }
        }

        /// <summary>
        /// 设置属性
        /// </summary>
        private string currentTime;

        public string CurrentTime { get => currentTime; set => SetProperty(ref currentTime, value); }
        //public string CurrentTime
        //{
        //    get { return this.currentTime; }
        //    set
        //    {
        //        SetProperty(ref currentTime, value);
        //    }
        //}
        private void StartUpdateTimer()
        {
            System.Windows.Threading.DispatcherTimer dispatcherTimer = new System.Windows.Threading.DispatcherTimer();
            dispatcherTimer.Interval = TimeSpan.FromSeconds(1);
            dispatcherTimer.Tick += (a, b) => UpdateTime();
            dispatcherTimer.Start();
        }

        private void UpdateTime()
        {
            CurrentTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
        }
    }
View Code

1.4、说明如下:

viewModel 继承自 ObservableObject

MainWindowModel : ObservableObject

1、双向绑定声明属性如下:

        private ushort _wendu;
        public ushort wendu
        {
            get { return this._wendu; }
            set
            {
                this._wendu = value;
                this.OnPropertyChanged();
            }
        }

这里的this.OnPropertyChanged如下:

 可以看到,ObservableObject 实现了INotifyPropertyChanged, INotifyPropertyChanging接口,因此实现了双向绑定,这种做法使我们的代码更加简洁。

2、SetProperty 方法,顾名思义,这是设置属性的方法,我们实时显示当前时间的功能就用到了这个功能

        /// <summary>
        /// 设置属性
        /// </summary>
        private string currentTime;

        public string CurrentTime { get => currentTime; set => SetProperty(ref currentTime, value); }
        //public string CurrentTime
        //{
        //    get { return this.currentTime; }
        //    set
        //    {
        //        SetProperty(ref currentTime, value);
        //    }
        //}
        private void StartUpdateTimer()
        {
            System.Windows.Threading.DispatcherTimer dispatcherTimer = new System.Windows.Threading.DispatcherTimer();
            dispatcherTimer.Interval = TimeSpan.FromSeconds(1);
            dispatcherTimer.Tick += (a, b) => UpdateTime();
            dispatcherTimer.Start();
        }

        private void UpdateTime()
        {
            CurrentTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
        }

3、执行无参函数 及 有参函数

        public IRelayCommand BtnCommand { get; set; }
        public IRelayCommand<string> Btn2Command { get; set; }
        
        public MainWindowModel()
        {
            //进度条模式为20
            this.wendu = 20;
            StartUpdateTimer();
            BtnCommand = new RelayCommand(DoBtnCommand);
            Btn2Command = new RelayCommand<string>(DoBtn2Command);
             
        }
        public void DoBtn2Command(string param)
        {
            this.wendu = 50;
            MessageBox.Show(param);
        }

        public void DoBtnCommand()
        {
            this.wendu = 88;
            MessageBox.Show("进度条的值修改为88,进度条向前动了。");
        }

 这里重点说明下有参函数执行的过程

xaml如下

 这里携带的参数是 timetextbox的text值

 @天才卧龙的波尔卡

 

标签:CommunityToolkit,Mvvm,get,currentTime,Toolkit,set,wendu,public
From: https://www.cnblogs.com/chenwolong/p/17865171.html

相关文章

  • WPF MVVM 学习理解
    <StackPanel><TextBoxText="{BindingName}"/><TextBoxText="{BindingTitle}"/><ButtonHeight="50"Command="{BindingShowCommand}"/></StackPanel>数据上下文绑定:this.DataContex......
  • TBtools的sequence toolkit常用功能介绍
    #博客园是我最近看到的一个平台,我在其它平台包括B站,简书,知乎,CSDN和小红书都有发布教程。fastaextract(recommended)给出序列的ID,可以提取特定序列,要点Initialize。fastastats查看序列文件的统计信息。sequencemanipulate(rev&comp)对序列进行正反链的互换,点击reverse和......
  • 使用MVVM Toolkit简化WPF开发
    最近.NET8的WPF推出了WPFFileDialog改进,这样无需再引用Win32命名空间就可以实现文件夹的选择与存储了,算是一个很方便的改进了。顺手写了一个小的WPF程序,在使用Model-View-ViewModel(MVVM)模式的时候,我不想使用Prism等重量级的框架,找了一个轻量级的MVVMCommunity......
  • SQL Server Hosting Toolkit
    TheDatabasePublishingWizardenablesthedeploymentofSQLServer2005databases(bothschemaanddata)intoasharedhostingenvironmentoneitheraSQLServer2000or2005server.Thetoolsupportstwomodesofdeployment:ItgeneratesasingleSQLsc......
  • WPF 使用 CommunityToolkit.Mvvm
    参考文档: IntroductiontotheMVVMToolkit-CommunityToolkitsfor.NET|MicrosoftLearn它是一个现代化,快速和模块化的MVVM库,对应用程序的结构或编译规范没有严格的限制。NuGet安装包搜索:CommunityToolkit.Mvvm导入usingCommunityToolkit.Mvvm;使用ObservableObjectpubli......
  • MVVM 和 MVC 区别是什么?
    1、基本定义MVVM基本定义MVVM即Model-View-ViewModel的简写,即模型-视图-视图模型,模型(Model)指的是后端传递的数据,视图(View)指的是所看到的页面,视图模型(ViewModel)是mvvm模式的核心,它是连接view和model的桥梁。它有两个方向:一是将模型(Model)转化成视图(View),即将后......
  • 循序渐进介绍基于CommunityToolkit.Mvvm 和HandyControl的WPF应用端开发(6) -- 窗口控
    在我们窗口新增、编辑状态下的时候,我们往往会根据是否修改过的痕迹-也就是脏数据状态进行跟踪,如果用户发生了数据修改,我们在用户退出窗口的时候,提供用户是否丢弃修改还是继续编辑,这样在一些重要录入时的时候,可以避免用户不小心关掉窗口,导致窗口的数据要重新录入的尴尬场景。本篇随......
  • 循序渐进介绍基于CommunityToolkit.Mvvm 和HandyControl的WPF应用端开发(4) -- 实现Da
    在我们设计软件的很多地方,都看到需要对表格数据进行导入和导出的操作,主要是方便客户进行快速的数据处理和分享的功能,本篇随笔介绍基于WPF实现DataGrid数据的导入和导出操作。1、系统界面设计在我们实现数据的导入导出功能之前,我们在主界面需要提供给客户相关的操作按钮,如下界面所示......
  • 循序渐进介绍基于CommunityToolkit.Mvvm 和HandyControl的WPF应用端开发(5) -- 树列表
    在我们展示一些参考信息的时候,有所会用树形列表来展示结构信息,如对于有父子关系的多层级部门机构,以及一些常用如字典大类节点,也都可以利用树形列表的方式进行展示,本篇随笔介绍基于WPF的方式,使用TreeView来洗实现结构信息的展示,以及对它的菜单进行的设置、过滤查询等功能的实现逻辑......
  • 论文阅读:DeepKE:A Deep Learning Based Knowledge Extraction Toolkit for Knowledge B
    DeepKE,支持数据集和模型的结合来实现非结构化数据中信息的提取。同时提出框架和一系列的组件来实现足够的模块化和可扩展性。项目地址1.Introduction现存的KB是在实体和关系方面是不完备的。常见的一些标志性的应用:Spacy(实体识别)OpenNER(关系提取)OpenIE(信息提取)RESIN(事......