什么是MVVM架构和数据绑定?
1、界面展示:其中的布局和样式就不说了,重点在MVVM架构和数据绑定(Model层使用EF(EntITy Framework)实体框架,不做介绍)。
绑定后:
2、架构介绍:
在Views层中新建CusGrouPEditWindow窗体,ViewModels中建立CusGroupEditViewModel类,在窗体的xaML或者cs中引用ViewModels对应类:
xaml中:
Window.DataContext>
local:CusGroupEditViewModel/> !--(添加引用local:为CusGroupEditViewModel的路径)-->
/Window.DataContext>
cs:DataContext = CusGroupEditViewModel。(添加引用路径)
/***********************************************/
*CsGroup是在ViewModel中定义的一个CusGroup对象, *
*CusGroup对象是在SQL数据库中的表,在EF中的对象。 *
/***********************************************/
3、TextBox绑定:
TextBox MaxWidth="550" Width="100" Text="{ Binding CsGroup.Alarm,Mode=TwoWay} " />
4、Button绑定:
Button Width="100" Height="35" Margin="10" Command="{ Binding BTnChangedCommand} " CommandParameter="btnCusGroupSave" Background="#fc8530" >
TextBlock Text="保存" FontWeight="Bold" FontSize="16"> /TextBlock>
/Button>
!-- Command="{ Binding BtnChangedCommand} "中是在ViewModel中的委托,继承ICommoand -->
!--CommandParameter="btnCusGroupSave" 参数-->
5、CheckBox绑定:
CheckBox Name="cbCash" Margin="0,0,5,0" IsChecked="{ Binding CsGroup.IsCash} "/>
!-- IsCash 是在SQL表中CusGroup中字段,bit类型--> 6、ComboBox绑定:
6、ComboBox绑定:
ComboBox MaxWidth="150" Width="100" SelectedValue="{
Binding StrCMBselectValue, Mode=TwoWay, UpdateSourceTrigger=PRopertyChanged}
" DisplayMemberPath="Text" SelectedValuePath="Value" ItemsSource="{
Binding LstCSGDownLevelID, Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}
" />
!--selectedValue:选中CommoBox的值,Mode双向模式,属性改变时触发;DisplayMemberPath:显示时绑定;SelectedValuePath:表示选择下拉框某一项对应的值;ItemsSource:绑定的数据源 -->
!-- 其中Value和Text也可理解为数据源,在ViewModel中有赋值-->
7、DataGrid绑定:
DataGrid ColumnWidth="*" SelectedItem="{
Binding currentSelectItem}
" ItemsSource="{
Binding CsGroupsAll}
" AutoGenerateColumns="False" IsReadOnly="True" >
DataGrid.Columns>
DataGridTextColumn Header="分组编号" Binding="{
Binding Code}
" />
DataGridTextColumn Header="分组名称" Binding="{
Binding Name}
" />
/DataGrid.Columns>
/DataGrid>
/***************************************************************/
//DataGrid当前选择对象private CusGroup currentSelectItem;
public CusGroup CurrentSelectItem {
get {
return currentSelectItem;
}
set{
currentSelectItem = value;
GetCutCmbSelect(value);
}
}
View Code
!--代码没有自动缩进,有点不知所措-->
/***************************************************************/
ViewModel 中的代码:
using HeYin.ERP.DataModels;
using HeYin.ERP.IServices;
using HeYin.ERP.Models;
using HeYin.ERP.Services;
using Microsoft.Practices.Prism.COMmands;
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Windows;
using System.Text.RegularExPressions;
using System.Windows.Controls;
namespace HeYin.ERP.Client.ViewModels.Customer{
class CusGroupEditViewModel : BaseViewModel {
private bool bIsAdd = false;
ICusGroupService CGS;
//调用IService接口#region Properties 属性private Guid gCsGroupID = Guid.Empty;
//All CusGroupprivate ListCusGroup>
csGroupsAll;
public ListCusGroup>
CsGroupsAll {
get {
return csGroupsAll;
}
set{
csGroupsAll = value;
//设定值OnPropertyChanged("CsGroupsAll");
//在属性更改后,通知 }
}
private ListCusGroup>
csGroupsMinPre@R_304_1413@;
public ListCusGroup>
CsGroupsAllMinPrestore {
get {
return csGroupsMinPrestore;
}
set{
csGroupsMinPrestore = value;
//设定值OnPropertyChanged("CsGroupsAllMinPrestore");
//在属性更改后,通知 }
}
//CusGroup对象private CusGroup csGroup;
public CusGroup CsGroup {
get {
return csGroup;
}
set{
csGroup = value;
OnPropertyChanged("CsGroup");
}
}
/// summary>
/// /// /summary>
private string strCMBselectValue;
public string StrCMBselectValue {
get {
return strCMBselectValue;
}
set{
if (value != null) {
strCMBselectValue = value;
OnPropertyChanged("StrCMBselectValue");
}
}
}
/// summary>
/// ComboBoxDataModel:作为一个ComboBox的对象,可以理解为数据源/// /summary>
private ObservableCollectionComboBoxDataModel>
lstCSGDownLevelID;
public ObservableCollectionComboBoxDataModel>
LstCSGDownLevelID {
get {
return lstCSGDownLevelID;
}
set{
lstCSGDownLevelID = value;
OnPropertyChanged("LstCSGDownLevelID");
}
}
//DataGrid当前选择对象private CusGroup currentSelectItem;
public CusGroup CurrentSelectItem {
get {
return currentSelectItem;
}
set{
currentSelectItem = value;
GetCutCmbSelect(value);
}
}
private int errorCount;
public int ErrorCount {
get =>
errorCount;
set =>
errorCount = value;
}
#endregion#region Commandspublic DelegateCommandstring>
BtnChangedCommand {
get;
set;
}
public DelegateCommandCusGroup>
TxtChangedCommand {
get;
set;
}
#endregionpublic CusGroupEditViewModel() {
CGS = new CusGroupService();
CsGroupsAll = new ListCusGroup>
();
csGroup = new CusGroup();
LstCSGDownLevelID = new ObservableCollectionComboBoxDataModel>
();
BtnChangedCommand = new DelegateCommandstring>
(MenuClick);
TxtChangedCommand = new DelegateCommandCusGroup>
(ChangeCMBValue);
GetAllCusGroups();
}
#region ButtonClickprivate void MenuClick(string strMessage) {
if (string.IsNullOrEmpty(strMessage)) return;
if (CsGroup == null) return;
switch (strMessage) {
case "btnCusGroupSave": Save();
break;
case "btnCusgroupadd": Add();
break;
case "btnCusGroupDelete": Delete();
break;
}
}
#endregion ButtonClick#region motheds/// summary>
/// 获取全部Group/// /summary>
private void GetAllCusGroups() {
//获取满足条件的客户分组信息 CsGroupsAll.Clear();
CsGroupsAll = CGS.Get(s =>
s.IsDelete == 0);
GetAllCMBItems();
//给降档分组下拉框赋值if ((gCsGroupID == null || gCsGroupID == Guid.Empty) &
&
CsGroupsAll.Count >
0) CsGroup = CsGroupsAll[0];
//给基础信息等赋值StrCMBselectValue = CsGroup.DownLevelID.ToString();
//设置降档分组默认值 }
/// summary>
/// 添加/// /summary>
/// param name="cg">
/param>
private void AddCusGroup(CusGroup cg) {
cg.ID = Guid.NewGuid();
//新建分组GUIDCg.IsDelete = 0;
//默认为0:不删除cg.CreateBy = App.GetCurrentUserId();
//创建人员关联员工 GUIDcg.CreateTime = DateTime.Now;
//初始化创建时间,应该使用服务器当前时间bool c = CGS.Add(cg);
if (c) {
MessageBox.Show(string.Format("创建新组别【{
0}
】成功!", CsGroup.Name), "提示", MessageBoxButton.OK, MessageBoxImage.Information);
GetAllCusGroups();
bIsAdd = false;
}
}
/// summary>
/// 修改/// /summary>
/// param name="cg">
/param>
private void UpdateCusGroup(CusGroup cg) {
bIsAdd = false;
cg.UpdateTime = DateTime.Now;
cg.UpdateBy = App.GetCurrentUserId();
//更新人员关联员工 GUIDstring[] str = {
"UpdateTime", "UpdateBy" }
;
bool b = CGS.Edit(cg, str);
if (b) {
MessageBox.Show("更改组别【成功】!", "提示", MessageBoxButton.OK, MessageBoxImage.Information);
GetAllCusGroups();
}
}
/// summary>
///删除方法(实为更新)/// /summary>
/// param name="cg">
/param>
private void DeleteCusGroup(CusGroup cg) {
cg.IsDelete = 1;
//更改数据库删除标志cg.UpdateTime = DateTime.Now;
//更新删除时间cg.UpdateBy = App.GetCurrentUserId();
//更新人员关联员工 GUIDstring[] str = {
"UpdateTime", "IsDelete", "UpdateBy" }
;
bool b = CGS.Edit(cg, str);
if (b) {
//MessageBox.Show(string.Format("已删除组别【{
0}
】!", CsGroup.Name), "提示", MessageBoxButton.OK, MessageBoxImage.Information);
GetAllCusGroups();
CsGroup = new CusGroup();
//清空对象bIsAdd = true;
}
}
/// summary>
/// 插入和更新方法调用/// /summary>
private void Save() {
if (ErrorCount >
0) {
//判断必填数据是否为空:为空则提示MessageBox.Show("请核对所填数据", "提示", MessageBoxButton.YesNo, MessageBoxImage.Information);
return;
}
if (bIsAdd) AddCusGroup(CsGroup);
elseUpdateCusGroup(CsGroup);
}
/// summary>
/// 获取降档分组下拉列表的值,并指定默认值/// /summary>
/// param name="value">
/param>
private void GetCutCmbSelect(CusGroup value) {
bIsAdd = false;
//点击新增后,再选择列表的逻辑if (value != null) {
CsGroup = CGS.GetById(value.ID);
//查找出当前选中的对象gCsGroupID = CsGroup.ID;
//保存当前选择对象的GUIDif (CsGroup != null) {
if (CsGroup.DownLevelID.HasValue) {
//如果降档ID有值,则默认显示,如果没有,则显示为空GetExceptCMBSelect();
//刷新下拉列表,先刷新,再赋值给默认值StrCMBselectValue = CsGroup.DownLevelID.ToString();
}
else{
LstCSGDownLevelID.Clear();
StrCMBselectValue = string.Empty;
}
}
}
}
private void Add() {
bIsAdd = true;
//点击新建分组时,重新获取所有降档ID对应的中文名 GetAllCMBItems();
CsGroup = new CusGroup();
}
private void Delete() {
if (this.CsGroup.ID == Guid.Empty || CsGroup.ID == null) MessageBox.Show("请选择要删除组别", "提示", MessageBoxButton.OK, MessageBoxImage.Information);
else{
MessageBoxResult msgResult = MessageBox.Show(string.Format("确定要删除分组【{
0}
】吗?", CsGroup.Name), "提示", MessageBoxButton.YesNo, MessageBoxImage.Information);
if (msgResult == MessageBoxResult.Yes) DeleteCusGroup(CsGroup);
}
}
/// summary>
/// 排除当前列的降档ID和对应的Name/// /summary>
private void GetExceptCMBSelect() {
LstCSGDownLevelID.Clear();
CsGroupsAllMinPrestore = CGS.Get(s =>
s.IsDelete == 0 &
&
s.MinPrestore = CsGroup.MinPrestore);
foreach (VAR iDlID in CsGroupsAllMinPrestore) {
if (iDlID.ID != CsGroup.ID) //去除当前选择ID对应的NameLstCSGDownLevelID.Add(new ComboBoxDataModel() {
Value = iDlID.ID.ToString(), Text = iDlID.Name }
);
}
}
/// summary>
/// 获取列表中所有降档ID和对应的Name/// /summary>
private void GetAllCMBItems() {
LstCSGDownLevelID.Clear();
foreach (var iDlID in CsGroupsAll) {
LstCSGDownLevelID.Add(new ComboBoxDataModel() {
Value = iDlID.ID.ToString(), Text = iDlID.Name }
);
}
}
private void ChangeCMBValue(CusGroup cgMinPrestore) {
LstCSGDownLevelID.Clear();
ListCusGroup>
lstTextChange = new ListCusGroup>
();
lstTextChange = CGS.Get(s =>
s.MinPrestore cgMinPrestore.MinPrestore);
foreach (var iDlID in lstTextChange) {
LstCSGDownLevelID.Add(new ComboBoxDataModel() {
Value = iDlID.ID.ToString(), Text = iDlID.Name }
);
}
}
public void SizeChangedCommand(object obj, SizeChangedEventArgs e) {
MessageBox.Show("日了狗");
}
#endregion}
}
View中代码:
client:BaseWindow x:Class="HeYin.ERP.Client.Views.Customer.CusGroupEditWindow" 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:Interaction="http://schemas.microsoft.com/expression/2010/interactions" xmlns:Interactivity="http://schemas.microsoft.com/expression/2010/interactivity" xmlns:CommonValidation="clr-namespace:HeYin.ERP.Common.Validation;
asSEMbly=HeYin.ERP.Common" xmlns:client="clr-namespace:HeYin.ERP.Client" mc:Ignorable="d" x:Name="CusGroupWindow" Title="客户分组" Height="500" Width="800" WindowStartupLocation="centerOwner" Loaded="Window_Loaded" MaxboXenable="True" MinboxEnable="False" >
Interactivity:Interaction.Triggers>
Interactivity:EventTrigger EventName="SizeChanged">
Interaction:CallMethodAction TargetObject="{
Binding}
" MethodName="SizeChangedCommand"/>
/Interactivity:EventTrigger>
/Interactivity:Interaction.Triggers>
Grid>
Grid.RowDefinitions>
RowDefinition Height="*" />
RowDefinition Height="50" />
/Grid.RowDefinitions>
Grid Grid.Row="0">
Grid.ColumnDefinitions>
ColumnDefinition Width="1*"/>
ColumnDefinition Width="2*"/>
/Grid.ColumnDefinitions>
!-- Left -->
Grid Margin="5,0,5,5">
GroupBox Name="gbGroupData">
GroupBox.HeaderTemplate>
DataTemplate>
WrapPanel Margin="{
staticResource WrapPanelMarginForInfo}
">
TextBlock Text="客户分组" Height="20" />
Button Width="20" Height="20" Margin="50,0,0,0" Command="{
Binding DataContext.BtnChangedCommand,RelativeSource={
RelativeSource Mode=FindAncestor,AncestorType=GroupBox}
}
" CommandParameter="btnCusGroupAdd" Visibility="{
Binding SaveVisibility,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}
">
Image Source="..\..\Resources\Images\16\Add.png" />
/Button>
Button Width="20" Height="20" Margin="10,0,0,0" Command="{
Binding DataContext.BtnChangedCommand,RelativeSource={
RelativeSource Mode=FindAncestor,AncestorType=GroupBox}
}
" CommandParameter="btnCusGroupDelete" Visibility="{
Binding SaveVisibility,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}
">
Image Source="..\..\Resources\Images\16\Clear.png" />
/Button>
/WrapPanel>
/DataTemplate>
/GroupBox.HeaderTemplate>
Grid>
Grid Grid.Row="1">
DataGrid ColumnWidth="*" SelectedItem="{
Binding CurrentSelectItem}
" ItemsSource="{
Binding CsGroupsAll}
" AutoGenerateColumns="False" IsReadOnly="True" >
DataGrid.Columns>
DataGridTextColumn Header="分组编号" Binding="{
Binding Code}
" />
DataGridTextColumn Header="分组名称" Binding="{
Binding Name}
" />
/DataGrid.Columns>
/DataGrid>
/Grid>
/Grid>
/GroupBox>
/Grid>
!-- Right -->
Grid Grid.Column="1" Margin="5">
Grid.RowDefinitions>
RowDefinition Height="*"/>
RowDefinition Height="100"/>
RowDefinition Height="130"/>
/Grid.RowDefinitions>
!-- 基础信息 -->
Grid>
GroupBox>
GroupBox.Header>
TextBlock Text="基础信息" Height="20"/>
/GroupBox.Header>
StackPanel>
Grid Margin="0,10">
Grid.ColumnDefinitions>
ColumnDefinition Width="*" />
ColumnDefinition Width="*" />
/Grid.ColumnDefinitions>
TextBox Visibility="Collapsed" x:Name="tbErrorCount" Text="{
Binding ErrorCount, Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}
">
/TextBox>
WrapPanel Margin="{
StaticResource WrapPanelMarginForInfo}
">
TextBlock Width="60" Margin="{
StaticResource TextBlockMarginForMostLeft}
">
Run Text="分组编号" />
/TextBlock>
TextBox Name="txtCusGropCrod" MaxWidth="150" Width="100" ToolTip="{
Binding RelativeSource={
RelativeSource self}
,Path=(Validation.Errors).CurrentItem.ErrorContent}
" Validation.Error="Validation_Error">
TextBox.Text>
Binding Path="CsGroup.Code" Mode="TwoWay" UpdateSourceTrigger="PropertyChanged" ValidatesOnDataErrors="True" NotifyOnValidationError="True">
Binding.ValidationRules>
ExceptionValidationRule>
/ExceptionValidationRule>
CommonValidation:RequiredValidationRule MaxLenth="15" ErrorMessage="分组编号" IsRequired="True" ValidatesOnTargetUpdated="True" />
/Binding.ValidationRules>
/Binding>
/TextBox.Text>
/TextBox>
/WrapPanel>
WrapPanel Margin="{
StaticResource WrapPanelMarginForInfo}
" Grid.Column="1">
TextBlock Text="分组名称" Width="60" Margin="{
StaticResource TextBlockMarginForMostLeft}
"/>
TextBox Name="txtCusGropName" MaxWidth="150" Width="100" ToolTip="{
Binding RelativeSource={
RelativeSource self}
,Path=(Validation.Errors).CurrentItem.ErrorContent}
" Validation.Error="Validation_Error">
TextBox.Text>
Binding Path="CsGroup.Name" Mode="TwoWay" UpdateSourceTrigger="PropertyChanged" ValidatesOnDataErrors="True" NotifyOnValidationError="True">
Binding.ValidationRules>
ExceptionValidationRule>
/ExceptionValidationRule>
CommonValidation:RequiredValidationRule MaxLenth="15" ErrorMessage="分组名称" IsRequired="True" ValidatesOnTargetUpdated="True" />
/Binding.ValidationRules>
/Binding>
/TextBox.Text>
/TextBox>
/WrapPanel>
/Grid>
Grid>
WrapPanel Margin="{
StaticResource WrapPanelMarginForInfo}
">
TextBlock Margin="{
StaticResource TextBlockMarginForMostLeft}
" Width="60" VerticalAlignment="Center">
Run Text="分组描述" />
/TextBlock>
TextBox x:Name="tbRemark" TextWrapping="Wrap" AcceptsReturn="True" VerticalScrollBarVisibility="Visible" Width="400" Height="90" ToolTip="{
Binding RelativeSource={
RelativeSource self}
,Path=(Validation.Errors).CurrentItem.ErrorContent}
" Validation.Error="Validation_Error">
TextBox.Text>
Binding Path="CsGroup.Description" Mode="TwoWay" UpdateSourceTrigger="PropertyChanged" ValidatesOnDataErrors="True" NotifyOnValidationError="True">
Binding.ValidationRules>
ExceptionValidationRule>
/ExceptionValidationRule>
CommonValidation:RequiredValidationRule MaxLenth="300" ErrorMessage="分组描述" ValidatesOnTargetUpdated="True" />
/Binding.ValidationRules>
/Binding>
/TextBox.Text>
/TextBox>
/WrapPanel>
/Grid>
/StackPanel>
/GroupBox>
/Grid>
!-- 消费相关 -->
Grid Grid.Row="1" Margin="0,10,0,10">
Grid>
GroupBox>
GroupBox.Header>
TextBlock Text="消费相关"/>
/GroupBox.Header>
Grid Margin="0,10">
Grid.ColumnDefinitions>
ColumnDefinition Width="*"/>
ColumnDefinition Width="*"/>
/Grid.ColumnDefinitions>
WrapPanel Margin="{
StaticResource WrapPanelMarginForInfo}
">
TextBlock Text="消费积分" Width="60" Height="20" Margin="{
StaticResource TextBlockMarginForMostLeft}
" />
TextBox Name="txtCusGropJF" MaxWidth="150" Width="100" Text="{
Binding CsGroup.PointConversion, Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}
" />
/WrapPanel>
WrapPanel Grid.Column="1" Margin="{
StaticResource WrapPanelMarginForInfo}
" HorizontalAlignment="Left" VerticalAlignment="Center">
CheckBox Name="cbCash" Margin="0,0,5,0" IsChecked="{
Binding CsGroup.IsCash}
"/>
TextBlock Text="开通预存或储值时禁止现金交易" />
/WrapPanel>
/Grid>
/GroupBox>
/Grid>
/Grid>
!-- 预存相关 -->
Grid Grid.Row="2">
GroupBox>
GroupBox.Header>
TextBlock Text="预存相关"/>
/GroupBox.Header>
StackPanel>
Grid Margin="0,10">
Grid.ColumnDefinitions>
ColumnDefinition Width="*"/>
ColumnDefinition Width="*"/>
/Grid.ColumnDefinitions>
WrapPanel Margin="{
StaticResource WrapPanelMarginForInfo}
">
TextBlock Width="80" Margin="{
StaticResource TextBlockMarginForMostLeft}
" >
Run Text="预存最低充值"/>
/TextBlock>
TextBox MaxWidth="150" Width="100" Text="{
Binding CsGroup.MinPrestore, Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}
" />
/WrapPanel>
WrapPanel Grid.Column="1" Margin="{
StaticResource WrapPanelMarginForInfo}
">
TextBlock Width="80" Text="金额低缺报警" Margin="{
StaticResource TextBlockMarginForMostLeft}
" />
TextBox MaxWidth="550" Width="100" Text="{
Binding CsGroup.Alarm,Mode=TwoWay}
" />
/WrapPanel>
/Grid>
Grid Margin="0,5">
WrapPanel Margin="{
StaticResource WrapPanelMarginForInfo}
">
TextBlock Width="190" Text="预存金额未达到最低要求时降档至" Margin="{
StaticResource TextBlockMarginForMostLeft}
"/>
ComboBox MaxWidth="150" Width="100" SelectedValue="{
Binding StrCMBselectValue, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}
" DisplayMemberPath="Text" SelectedValuePath="Value" ItemsSource="{
Binding LstCSGDownLevelID, Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}
" />
/WrapPanel>
/Grid>
/StackPanel>
/GroupBox>
/Grid>
/Grid>
/Grid>
!-- bottom -->
Grid Grid.Row="2">
WrapPanel HorizontalAlignment="Center" VerticalAlignment="Center" Margin="{
StaticResource WrapPanelMarginForInfo}
">
Button Margin="1" Command="{
Binding BtnChangedCommand}
" CommandParameter="btnCusGroupSave" Background="#fc8530" Style="{
StaticResource SaveButtonStyle}
" Visibility="{
Binding SaveVisibility,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}
" >
TextBlock Text="保存" FontWeight="Bold" FontSize="16">
/TextBlock>
/Button>
/WrapPanel>
/Grid>
/Grid>
/client:BaseWindow>
以上就是什么是MVVM架构和数据绑定?的详细内容,更多请关注其它相关文章!
声明:本文内容由网友自发贡献,本站不承担相应法律责任。对本内容有异议或投诉,请联系2913721942#qq.com核实处理,我们将尽快回复您,谢谢合作!
若转载请注明出处: 什么是MVVM架构和数据绑定?
本文地址: https://pptw.com/jishu/592405.html
