使用MVVM框架來實(shí)現(xiàn)一個簡單加法器。最終效果如下,點(diǎn)擊按鈕可以對上面兩個文本框中的數(shù)字進(jìn)行相加得出結(jié)果顯示在第三個文本框中。重點(diǎn)在于看mvvm框架下程序該怎么寫。使用CommunityToolkit.Mvvm框架,通過nuget進(jìn)行安裝。
整個工程結(jié)構(gòu)
CalcModel.cs
該文件中存放數(shù)據(jù)類,類中定了三個屬性Input1、Input2、Result。分別代表輸入1、輸入2和計(jì)算結(jié)果。和一般的屬性不同,該Model屬性為了實(shí)現(xiàn)屬性變化可以進(jìn)行通知和一般的屬性有些區(qū)別。
- 類要繼承自O(shè)bservableObject
- 屬性set要調(diào)用SetProperty方法。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using CommunityToolkit.Mvvm;
using CommunityToolkit.Mvvm.ComponentModel;
namespace WpfApp15.Model
{
public class CalcModel:ObservableObject
{
int input1 = 0;
public int Input1
{
get = > input1;
set
{
SetProperty(ref input1, value);
}
}
int input2 = 0;
public int Input2
{
get = > input2;
set
{
SetProperty(ref input2, value);
}
}
int result = 0;
public int Result
{
get = > result;
set
{
SetProperty(ref result, value);
}
}
}
}
MyViewModel.cs
這個部分是業(yè)務(wù)核心內(nèi)容,連接View和Model之間的橋梁。因?yàn)槲覀兊讓拥腗odel已經(jīng)具備了屬性通知的功能,所以在這個層次里面不需要再次封裝。有可能我們Model來自于別人寫好的不能修改還要支持屬性通知,那就要在這里進(jìn)行再次封裝才能和View進(jìn)行綁定。
該層實(shí)現(xiàn)了一個命令CmdCalc
,可以和View層綁定進(jìn)行加法的計(jì)算。借用Mvvm框架實(shí)現(xiàn)命令很簡單:
- 定義一個ICommand接口的屬性CmdCalc
- 在類構(gòu)造函數(shù)中創(chuàng)建一個RelayCommand的實(shí)例賦值給CmdCalc
- RelayCommand的參數(shù)
Calc
方法中實(shí)現(xiàn)了具體的計(jì)算
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Input;
using CommunityToolkit.Mvvm;
using CommunityToolkit.Mvvm.ComponentModel;
using CommunityToolkit.Mvvm.Input;
using WpfApp15.Model;
namespace WpfApp15.ViewModel
{
public class MyViewModel
{
public CalcModel Model { get; set; }
public ICommand CmdCalc { get;}
private void Calc()
{
Model.Result=Model.Input1+Model.Input2;
}
public MyViewModel()
{
Model=new CalcModel();
CmdCalc = new RelayCommand(Calc);
}
}
}
MainWindow.xaml
這個就是View層,負(fù)責(zé)界面的顯示。這里面重點(diǎn)的也就是三個TextBox和一個Button。三個TextBox分別綁定了Model的三個屬性。Button綁定了CmdCalc命令,命令可以在按鈕點(diǎn)擊的時候被觸發(fā),替代了傳統(tǒng)的Click事件。
Window x:Class="WpfApp15.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:WpfApp15"
mc:Ignorable="d"
Title="MainWindow" Height="450" Width="800" >
StackPanel >
Grid >
Grid.ColumnDefinitions >
ColumnDefinition > /ColumnDefinition >
ColumnDefinition > /ColumnDefinition >
/Grid.ColumnDefinitions >
TextBox Text="{Binding Model.Input1}" Grid.Row="0" Grid.Column="0" Height="30" Margin="10"/ >
TextBox Text="{Binding Model.Input2}" Grid.Row="0" Grid.Column="1" Height="30" Margin="10"/ >
/Grid >
TextBox Text="{Binding Model.Result,Mode=TwoWay}" Grid.Row="0" Grid.Column="1" Height="30" Margin="10"/ >
Button Command="{Binding CmdCalc}" Height="40" Width="200" Margin="10"/ >
/StackPanel >
/Window >
還有一步
目前還不能工作,還要在主窗口的構(gòu)造函數(shù)中設(shè)置下DataContext,這樣View層的綁定才知道去哪里尋找Model.Input1``Model.Input2``Model.Result``CmdCalc
這些屬性和命令。
public partial class MainWindow : Window
{
public MyViewModel vm=new MyViewModel();
public MainWindow()
{
InitializeComponent();
this.DataContext = vm;
}
}
到此為止
這樣一個簡單的例子就展示了MVVM的整體一個基本結(jié)構(gòu)。把數(shù)據(jù)、界面、業(yè)務(wù)邏輯給分開在不同的層次中,使開發(fā)更加清晰,維護(hù)更加方便。
-
加法器
+關(guān)注
關(guān)注
6文章
183瀏覽量
30233 -
程序
+關(guān)注
關(guān)注
117文章
3795瀏覽量
81411 -
函數(shù)
+關(guān)注
關(guān)注
3文章
4346瀏覽量
62973 -
命令
+關(guān)注
關(guān)注
5文章
696瀏覽量
22111
發(fā)布評論請先 登錄
相關(guān)推薦
加法器
加法器,加法器是什么意思
十進(jìn)制加法器,十進(jìn)制加法器工作原理是什么?
FPU加法器的設(shè)計(jì)與實(shí)現(xiàn)
![FPU<b class='flag-5'>加法器</b>的設(shè)計(jì)與<b class='flag-5'>實(shí)現(xiàn)</b>](https://file.elecfans.com/web2/M00/49/61/pYYBAGKhtEqAbEJpAACbm9iW7rw927.jpg)
同相加法器電路原理與同相加法器計(jì)算
![同相<b class='flag-5'>加法器</b>電路原理與同相<b class='flag-5'>加法器</b>計(jì)算](https://file1.elecfans.com//web2/M00/A6/92/wKgZomUMPsWAbxoLAAAq_uz8h5k310.png)
怎么設(shè)計(jì)一個32位超前進(jìn)位加法器?
![怎么設(shè)計(jì)<b class='flag-5'>一</b><b class='flag-5'>個</b>32位超前進(jìn)位<b class='flag-5'>加法器</b>?](https://file1.elecfans.com//web2/M00/A6/C3/wKgZomUMQDiAD3cDAAAIv7ze0k8311.png)
加法器是如何實(shí)現(xiàn)的
![<b class='flag-5'>加法器</b>是如何<b class='flag-5'>實(shí)現(xiàn)</b>的](https://file.elecfans.com/web1/M00/DF/26/pIYBAGAuD-qABrrCAAAbc6CaSTc581.jpg)
超前進(jìn)位加法器是如何實(shí)現(xiàn)記憶的呢
![超前進(jìn)位<b class='flag-5'>加法器</b>是如何<b class='flag-5'>實(shí)現(xiàn)</b>記憶的呢](https://file.elecfans.com/web2/M00/5A/EF/poYBAGLs10mAP3LmAAFrpkjKNyw340.png)
加法器的原理及采用加法器的原因
加法器的原理是什么 加法器有什么作用
![<b class='flag-5'>加法器</b>的原理是什么 <b class='flag-5'>加法器</b>有什么作用](https://file1.elecfans.com/web2/M00/E8/4C/wKgZomZO4-eATXiSAABVVj4kUoo111.jpg)
評論