mg4155com > mg4155线路检测手机版 > 浅谈MVVM情势在控件编写中的一些定义和操作方法

原标题:浅谈MVVM情势在控件编写中的一些定义和操作方法

浏览次数:52 时间:2019-10-04

<UserControl x:Class="MVVM_for_UserControl_Test.TestControl" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:local="clr-namespace:MVVM_for_UserControl_Test" mc:Ignorable="d" d:DesignHeight="300" d:DesignWidth="300"> <UserControl.Resources> <local:TestViewModel x:Key="TestViewModel"/> </UserControl.Resources> <UserControl.DataContext> <Binding Source="{StaticResource TestViewModel}"/> </UserControl.DataContext> <StackPanel> <TextBox DataContext="{StaticResource TestViewModel}" Text="{Binding ThisText}"></TextBox> </StackPanel></UserControl>

一样的,需求专心的是,MyText那个依从属性的setter中大家也加了一个剖断。这里要解释一下为啥要有其一论断了,那就涉嫌到循环公告的问题。

1、GridView间接录入数据回想

在头里整合的数目录入案例里面,我们能够看见能够在列表里面平素录入速度的便捷性,如下所示。1)直接在GridView上录入并保存

图片 1

2)基于WInform分页控件的直白录入和保存

图片 2这种艺术正是运用在Griview上对数码校验后展内江存。校验通过后交付数据库,大家第一要求做的点子是一定记录会集里面当前的笔录,把它转换为实际的实体类对象,然后写入新记录也许更新管理,如下所示。图片 3

图片 4

一旦您是Win10连串那就很简短了,直接展开本身的微管理器,在文书扩展名上打勾就行了:

*结论是TextBoxText品质在找出绑定的ThisText本条门路的时候根本就找不到能够绑定的ThisText*

  1. UserControl不应有对外暴暴露和自身逻辑、渲染有关的别的API,一切控件内部的变动都应当由暴暴露来的依据属性的改观当作触发;
  2. UserControl的借助属性不时必要和个中间的子控件进行Binding。

在自个儿上篇小说《在DevExpress程序中应用Winform分页控件直接录入数据并保存》中介绍了在GridView以及在其卷入的分页控件上做多少的直白录入的拍卖,介绍情状下多少的保存和校验等操作,可是还并未有涉及到数量列表采用的这种办法,而这种在等级次序采用也是相比常见的一种输入情势。本篇小说继续探求在GridView上一贯录入数据,并追加字典选取列表的效用。

END.

本来如若你的文件目录未有体现后缀名,如图:

一开头遭受这么些主题材料的时候本人也懵逼了,因为那不合情理,于是作者反复调节和测量检验,开掘只要把TestViewModel绑到UserControl的里边零件上(只要那几个组件是TextBox的父组件),那么就从不难题。这让笔者百思不得其解,于是去谷歌了半天,终于找到了那篇文章:[WPF]UserControl.DataContext與調用端的依賴關係,然后精通到了那般二个真相:

浅谈MVVM情势在控件编写中的一些定义和操作方法,Winform零基础入门教程。TestContro.xaml.cs:

2、基于数据字典的下拉列表选用输入

笔者们上边介绍的开始和结果,作为数据直接录入的补给,提供基于数据字典的下拉列表输入格局。首先大家来拜谒全体的效果,然后在一步步深入分析内部的深邃。

图片 5

譬喻对于性其余挑选格局。

图片 6以及基于能够寻觅的下拉列表图片 7以及多选框的数码呈现管理图片 8

或许依据按键选择对话框的兑现

图片 9这一个操作能够给列表录入提供多样化的抉择,也丰富了客户的输入方式。那么我们怎么着依据GridView的底子上落实那些意义吗?首先大家依据模型创设数据库表,数据库表设计如下所示。图片 10接下来依据Database2Sharp代码生成工具生成框架底层的代码,以及生成WInform分界面代码,生成的分界面代码在那之中绑定数据部分如下所示。

/// <summary>/// 绑定列表数据/// </summary>private void BindData(){ //entity this.winGridViewPager1.DisplayColumns = "Name,Sex,Nationality,BirthDate,Height,Weight,City,Area,State,Favorites,Introduction,Creator,CreateTime"; this.winGridViewPager1.ColumnNameAlias = BLLFactory<Test>.Instance.GetColumnNameAlias();//字段列显示名称转义 string where = GetConditionSql(); var list = BLLFactory<Test>.Instance.FindWithPager(where, this.winGridViewPager1.PagerInfo); this.winGridViewPager1.DataSource = new WHC.Pager.WinControl.SortableBindingList<TestInfo>; this.winGridViewPager1.PrintTitle = "人员测试信息报表";} 

笔者们为了丰盛对应的第一手录入情势,大家须求设置当中的字典绑定,管理格局如下所示,大家通过多个函数SetRepositoryItems来封装所需管理。

/// <summary>/// 设置GridControl对应的下拉类别内容,方便转义/// </summary>private void SetRepositoryItems(GridView gridview){ var sexList = new List<CListItem>(){new CListItem, new CListItem, new CListItem("未知", "0")}; gridview.Columns.ColumnByFieldName.CreateLookUpEdit().BindDictItems(sexList, false); gridview.Columns.ColumnByFieldName.CreateLookUpEdit().BindDictItems; gridview.Columns.ColumnByFieldName("Nationality").CreateSearchLookUpEdit().BindDictItems; gridview.Columns.ColumnByFieldName.CreateLookUpEdit().BindDictItems; gridview.Columns.ColumnByFieldName.CreateLookUpEdit().BindDictItems; gridview.Columns.ColumnByFieldName("Favorites").CreateCheckedComboBoxEdit().BindDictItems; gridview.Columns.ColumnByFieldName("Introduction").CreateMemoEdit(); gridview.Columns.ColumnByFieldName("Creator").CreateButtonEdit().ButtonClick += (object sender, ButtonPressedEventArgs e) => { FrmSelectCustomer dlg = new FrmSelectCustomer(); if(dlg.ShowDialog() == System.Windows.Forms.DialogResult.OK) { if(gridview.GetFocusedRow() == null) { gridview.AddNewRow();//如果首次则增加一行 } gridview.SetFocusedRowCellValue("Creator", dlg.CustomerName); } }; gridview.OptionsBehavior.ReadOnly = false; gridview.OptionsBehavior.Editable = true;}

接下来在上头的BindData函数里面参加那些主意调用就可以。

SetRepositoryItems(this.winGridViewPager1.gridView1);

里面包车型大巴CreateLookUp艾德it、CreateSearchLookUpEdit、CreateCheckedComboBoxEdit、CreateButtonEdit等办法是框架底层举办的剧情展现控件的拍卖,为了便于作为增加函数直接动用的,其准则类似代码类似上面包车型大巴管理情势。

/// <summary>/// 创建GridView的列编辑为SearchLookUpEdit/// </summary>/// <param name="gridColumn">GridColumn列对象</param>/// <returns></returns>public static RepositoryItemSearchLookUpEdit CreateSearchLookUpEdit(this GridColumn gridColumn){ RepositoryItemSearchLookUpEdit repositoryItem = new RepositoryItemSearchLookUpEdit { AutoHeight = false, NullText = "" }; gridColumn.View.GridControl.RepositoryItems.Add(repositoryItem); gridColumn.ColumnEdit = repositoryItem; return repositoryItem;}

理之当然大家还索要登记响应的处管事人件,代码如下所示。

private void RegisterEvent(){ var grd = this.winGridViewPager1.gridControl1; var grv = this.winGridViewPager1.GridView1; grv.InitGridView(GridType.NewItem, false); #region 列表处理事件 grv.InitNewRow += delegate(object sender, InitNewRowEventArgs e) { GridView gridView = grd.FocusedView as GridView; gridView.SetFocusedRowCellValue("ID", Guid.NewGuid().ToString; gridView.SetFocusedRowCellValue("Creator", LoginUserInfo.Name); gridView.SetFocusedRowCellValue("CreateTime", DateTime.Now); }; grv.ValidateRow += delegate(object sender, ValidateRowEventArgs e) { var result = grd.ValidateRowNull(e, new string[] { "Name" }); //校验通过后提交数据库 GridView gridView = grd.FocusedView as GridView; if  { var newInfo = grv.GetFocusedRow() as TestInfo; if (newInfo != null) { result = BLLFactory<Test>.Instance.InsertUpdate(newInfo, newInfo.ID); if  { e.Valid = false; e.ErrorText = string.Format; } else { base.ShowMessageAutoHide(); } } } }; #endregion}

接下来在窗体开头化的时候,调用下边包车型地铁挂号事件就可以。

/// <summary>/// 人员测试信息/// </summary> public partial class FrmTest : BaseDock{ public FrmTest() { InitializeComponent(); InitDictItem(); this.winGridViewPager1.OnPageChanged += new EventHandler(winGridViewPager1_OnPageChanged); this.winGridViewPager1.OnStartExport += new EventHandler(winGridViewPager1_OnStartExport); this.winGridViewPager1.OnEditSelected += new EventHandler(winGridViewPager1_OnEditSelected); this.winGridViewPager1.OnAddNew += new EventHandler(winGridViewPager1_OnAddNew); this.winGridViewPager1.OnDeleteSelected += new EventHandler(winGridViewPager1_OnDeleteSelected); this.winGridViewPager1.OnRefresh += new EventHandler(winGridViewPager1_OnRefresh); this.winGridViewPager1.AppendedMenu = this.contextMenuStrip1; this.winGridViewPager1.ShowLineNumber = true; this.winGridViewPager1.BestFitColumnWith = false;//是否设置为自动调整宽度,false为不设置 this.winGridViewPager1.gridView1.DataSourceChanged += new EventHandler(gridView1_DataSourceChanged); this.winGridViewPager1.gridView1.CustomColumnDisplayText += new DevExpress.XtraGrid.Views.Base.CustomColumnDisplayTextEventHandler(gridView1_CustomColumnDisplayText); this.winGridViewPager1.gridView1.RowCellStyle += new DevExpress.XtraGrid.Views.Grid.RowCellStyleEventHandler(gridView1_RowCellStyle); //关联回车键进行查询 foreach (Control control in this.layoutControl1.Controls) { control.KeyUp += new System.Windows.Forms.KeyEventHandler(this.SearchControl_KeyUp); } //注册对应的GridView处理事件 RegisterEvent(); }

作者们在数据源变化的时候,设置好各种列的上涨的幅度,方便日常彰显内容就很周密了。

/// <summary>/// 绑定数据后,分配各列的宽度/// </summary>private void gridView1_DataSourceChanged(object sender, EventArgs e){ if (this.winGridViewPager1.gridView1.Columns.Count > 0 && this.winGridViewPager1.gridView1.RowCount > 0) { //统一设置100宽度 foreach (DevExpress.XtraGrid.Columns.GridColumn column in this.winGridViewPager1.gridView1.Columns) { column.Width = 100; } //Name,Sex,BirthDate,Height,Weight,City,Area,State,Favorites,Introduction,Creator,CreateTime //可特殊设置特别的宽度 SetGridColumWidth("BirthDate", 120); SetGridColumWidth("CreateTime", 120); SetGridColumWidth("Introduction", 200); SetGridColumWidth("Favorites", 200); }}

与上述同类,基于开拓框架基础上就到位了这种直白录入数据的拍卖完毕了,特别便于,当然要是平素利用未有包装的GridView管理,基本上也是未有太多变化,思路一致的。

循环退换内容

在实行播报音乐的时候,找出一下对应目录是还是不是满含歌词文件:

留意到本凡间接把TestViewModel绑定到了TextBoxDataContext上,那么一旦大家删除掉那么些绑定会冒出什么境况吧?

能够阅览,当ThisText那特性子被修改的时候我们发出了五个新闻布告View要求革新MyText属性。可是供给注意的是,这里有贰个if(_myText == value) 那个判断,这一个判定是丰裕须求的,至于为啥需求这些判定放到后边来说。

浅析原因:

歌词展现分析

 <UserControl.DataContext> <Binding Source="{StaticResource TestViewModel}"/> </UserControl.DataContext>

思索一下,假若是ViewModel中的ThisText发生了更动,那么它就能够去通告View中的MyText发生更换,而MyText产生变动以往又回来布告ViewModel中的ThisText去产生转移……如此就发出了死循环,由此为了打破那一个“通告怪圈”,大家需求加上三个if判别来终止它:当公告作者要扩充改动的源委并未变动,那么大家就概略这一个更换。注意,那一个操作是那贰个重大的,若无这几个操作,那么万事程序将不能符合规律运行。

图片 11

生存在不著名的本科高校,白天是学生族,早晨是程序猿和文化服务工小编。

这段绑定代码,即把TestViewModel一直绑到了UserControl.DataContext上,那么当TextBox在询问绑定对象的时候逐级向上回溯应该是可以找到那几个ViewModel的,可是现实却告知大家并非那样。

既然如此View显明好了,那么怀恋第一个,什么人是ViewModel?这一个主题材料实际上也很好回答,为UserControl内建三个ViewModel就行,它承受UserControl的逻辑、渲染等调节。而UserControl全数内部子控件须要Binding的依赖属性都应当去和ViewModel中的依赖属性进行绑定,而不应有直接和UserControl的注重性属性产生涉及

多线程施行耗费时间操作

安装文件后缀名突显1

在头里笔者写的《浅谈MVVM格局在控件编写中的一些定义和操作方法》中,在编写UserControl的xaml的时候作者编写了这样子的代码:

  1. UserControl应该对外暴表露信赖属性;

写代码也要读书,爱全栈,更爱生活。天天更新原创IT编制程序本领及常见实用录像。

本人安顿写一部关于C#学习入门的一站式学科,现在早就到达第二片段,基础语法教程已经写达成。目录:

约等于说,依据地点那样管理的话,*由于UserControl.DataContext被它的父ViewDataContext给覆盖掉了(MainViewModel.Main),因此TextBox在搜索绑定的时候一贯找到了表面ViewDataContext中去了,而那个DataContext是没有ThisText以此门路的,所以绑定战败*。

在WPF中有UserControl和CostumeControl二种控件,当中CostumeControl是属于look-less Control,由此在应用上和平时的控件事实上并未任何分裂,在作者眼里所谓的CostumeControl事实上正是Modify-and-reuse Control,因而一旦WPF工程使用了MVVM形式以来,CostumeControl事实上边向Main View是从未有过怎么内部黑盒的,所以在行使MVVM时不必要思索太多难题。

此时,运行:

音乐播放器

UserControl.DataContext暴露Main View中的,如果Main View内定了它的DataContext(比方Window.DataContext)、且尚未在Main View中显式钦点这些UserControlDataContext的话,*那么从Main View早先沿着视觉树往下,这些UserContextDataContext将会被上级View给覆盖掉*。

个中MessageTokens是用来差异新闻类型的Token,表示音讯从何地发往哪儿,举例MyTextChangedFromView表示音讯来自View那边,而MyTextChangedFromViewModel表示音信来源ViewModel那边。

创设Winform应用程序项目,在分界面增多按键,实现持续转换开关的开始和结果:

歌词展现大家就兑现读取,当对应的岁月的时候显得歌词就够了。下边看下lrc歌词文件的故事情节是什么?

其一标题就很奇葩了,按道理来讲,既然大家早已有了

据此,经过地点的评论,大家领略了要编写制定一个UserControl使用的实际上是VVM格局,那么具体要怎么操作呢?经过一段时间的考察,作者查找寻了四个相应算是比较好用的秘诀,总括起来如下:

跨线程采访控件

酷作者音乐盒歌词文件

那就是说反过来,假如大家把TestViewModel绑定到UserControl的个中控件上的话,*那么就不会蒙受外界ViewDataContext的掩没大概说忧愁*,因而可以顺畅地产生绑定的探索。

在后台代码中我们为UserControl定义了MyText那些依附属性,然后在这本天性被改成时的回调方法中发送了三个音讯,告诉ViewModel去改动它的应和的性质。一样的,在构造函数中大家也定义了叁个监听器用来监听前边谈到的从ViewModel发过来的翻新指令。

单线程的问题

歌词展现

本文由mg4155com发布于mg4155线路检测手机版,转载请注明出处:浅谈MVVM情势在控件编写中的一些定义和操作方法

关键词:

上一篇:设置破解教程,指针函数和函数指针的区分

下一篇:没有了