DevExpress WinForm控件入门指南:WinForms MVVM – 数据和属性绑定(Part 1)

根据您绑定的属性,存在以下三种可能的情况:

  • 属性依赖 – 来自同一个ViewModel的两个属性被绑定。

常规绑定

如果您需要将数据从一个属性传递到另一个ViewModel的属性,可以使用标准的数据绑定 API,或者我们推荐DevExpress Mvvm Context.Set绑定方法。

例如,一个视图有一个没有文本的LabelControl,ViewModel有一个可绑定的字符串“LabelText”属性。使用以下任何一种方法将属性值传递给此 Label。

WinForms MVVM - 数据和属性绑定图 1

C#

//ViewModel code[POCOViewModel()]public class Form1ViewModel {public Form1ViewModel() {LabelText = "Value stored in ViewModel";}public virtual string LabelText { get; set; }}//View code//option #1 (recommended): SetBinding methodvar fluent = mvvmContext1.OfType<Form1ViewModel>();fluent.SetBinding(labelControl1, l => l.Text, x=>x.LabelText);//option #2: DataBindingsForm1ViewModel viewModel = mvvmContext1.GetViewModel<Form1ViewModel>();labelControl1.DataBindings.Add("Text", viewModel, "LabelText");

VB.NET

'ViewModel code<POCOViewModel()>Public Class Form1ViewModelPublic Sub New()LabelText = "Value stored in ViewModel"End SubPublic Overridable Property LabelText() As StringEnd Class'View code'option #1 (recommended): SetBinding methodDim fluent = mvvmContext1.OfType(Of Form1ViewModel)()fluent.SetBinding(labelControl1, Function(l) l.Text, Function(x) x.LabelText)'option #2: DataBindingsDim viewModel As Form1ViewModel = mvvmContext1.GetViewModel(Of Form1ViewModel)()labelControl1.DataBindings.Add("Text", viewModel, "LabelText")
在POCO ViewModels中更新通知

如果绑定属性的值可以更改,请务必将此更改通知相关属性,为此请将更新通知发送到相关属性。 如果您使用POCO ViewModels,DevExpress框架可以发送这些通知。

什么是POCO视图模型/strong>

在MVVM应用中,每个View都有一个相关的ViewModel。在使用DevExpress MVVM Framework时,应该为每个View添加一个MvvmContext组件,并将该组件指向与该View相关的ViewModel,建议在设计时通过组件的智能标记菜单执行此操作。

WinForms MVVM - 数据和属性绑定图 2

您还可以使用ViewModelType属性在代码中执行此操作。

C#

mvvmContext.ViewModelType = typeof(ViewModel);

VB.NET

mvvmContext.ViewModelType = GetType(ViewModel)

框架将分配给MvvmContext组件的每个ViewModel视为POCO(Plain Old CRL Object)ViewModel。POCO ViewModels有许多命名和语法约定,如果您遵循它们,框架会预测您想要做什么并相应地采取行动。例如,更新通知会自动发送到(来自)“正确”声明的属性。

创建一个公共虚拟自动实现属性,以允许框架向该属性发送更新通知以及从该属性发送更新通知,还可以将属性设置器声明为protected。

C#

public virtual string Name { get; set; }public virtual int ID { get; protected set; }

VB.NET

Public Overridable Property Name() As StringPublic Overridable Property ID() As IntegerGetReturn _privateIDEnd GetProtected Set(ByVal value As Integer)_privateID = valueEnd SetEnd Property

注意:框架会忽略带有支持字段的属性,使用DevExpress.Mvvm.DataAnnotations.BindableProperty属性标记此类属性,以便能够绑定此类属性。

C#

using DevExpress.Mvvm.DataAnnotations;//. . .string name;[BindableProperty]public virtual string Name {get { return name; }set { name = value; }}

VB.NET

Imports DevExpress.Mvvm.DataAnnotations'. . .Private name_field As String<BindableProperty>Public Overridable Property Name() As StringGetReturn name_fieldEnd GetSet(ByVal value As String)name_field = valueEnd SetEnd Property

WinForms MVVM - 数据和属性绑定图 3

C#

//View codevar fluent = mvvmContext.OfType<ViewModel>();fluent.SetBinding(editor, ed => ed.EditValue, x => x.Text);fluent.SetBinding(label, lbl => lbl.Text, x => x.Title);//ViewModel codepublic class ViewModel {public virtual string Text { get; set; }public string Title {get {if(Text == null)return "Title: (Null)";if(Text.Length == 0)return "Title: (Empty)";if(string.IsNullOrWhiteSpace(Text))return "Title: (Whitespace)";return "Title: " + Text;}}}

VB.NET

'View codeDim fluent = mvvmContext.OfType(Of ViewModel)()fluent.SetBinding(editor, Function(ed) ed.EditValue, Function(x) x.Text)fluent.SetBinding(label, Function(lbl) lbl.Text, Function(x) x.Title)'ViewModel codePublic Class ViewModelPublic Overridable Property Text() As StringPublic ReadOnly Property Title() As StringGetIf Text Is Nothing ThenReturn "Title: (Null)"End IfIf Text.Length = 0 ThenReturn "Title: (Empty)"End IfIf String.IsNullOrWhiteSpace(Text) ThenReturn "Title: (Whitespace)"End IfReturn "Title: " & TextEnd GetEnd PropertyEnd Class

重要提示:上面的代码演示了“Title”和“Text”属性之间的区别,并不完整。 演示模块还使用属性依赖来在“Text”更改时更新“Title”。

DevExpress WinForm | 下载试用

DevExpress WinForm拥有180+组件和UI库,能为Windows Forms平台创建具有影响力的业务解决方案。DevExpress WinForms能完美构建流畅、美观且易于使用的应用程序,无论是Office风格的界面,还是分析处理大批量的业务数据,它都能轻松胜任!

更多产品正版授权详情及优惠,欢迎咨询在线客服>>


DevExpress技术交流群4:715863792      欢迎一起进群讨论

DevExpress 增值服务火热销售中
标签:

声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2021年9月16日
下一篇 2021年9月16日

相关推荐

发表回复

登录后才能评论