DevExpress WinForm MVVM数据和属性绑定指南(Part 1)

摘要:
获取工具下载-DevExpressWinFormv21.1常规绑定如果您需要将数据从一个属性传递到另一个ViewModel的属性,可以使用标准的数据绑定API,或者我们推荐DevExpressMvvmContext.Set绑定方法。如果您使用POCOViewModels,DevExpress框架可以发送这些通知。在使用DevExpressMVVMFramework时,应该为每个View添加一个MvvmContext组件,并将该组件指向与该View相关的ViewModel,建议在设计时通过组件的智能标记菜单执行此操作。C#mvvmContext.ViewModelType=typeof;VB.NETmvvmContext.ViewModelType=GetType框架将分配给MvvmContext组件的每个ViewModel视为POCOViewModel。C#usingDevExpress.Mvvm.DataAnnotations;//...stringname;[BindableProperty]publicvirtualstringName{get{returnname;}set{name=value;}}VB.NETImportsDevExpress.Mvvm.DataAnnotations'...Privatename_fieldAsStringPublicOverridablePropertyName()AsStringGetReturnname_fieldEndGetSetname_field=valueEndSetEndProperty在BindablePropertiesdemo中,一个Label显示了TextEdit编辑器的值。TextEdit绑定到自动实现的虚拟Text属性,而Label绑定到Title。

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

  • 常规绑定- ViewModel属性绑定到任何不可编辑的View元素属性。由于该元素不可编辑,因此您无需将更新通知发送回绑定属性(单向绑定)。
  • 数据绑定- Model属性(数据字段)绑定到编辑器属性。如果用户可以更改编辑器值,则需要更新绑定属性(双向绑定)。
  • 属性依赖- 来自同一个ViewModel的两个属性被绑定。

获取工具下载 - DevExpress WinForm v21.1

常规绑定

如果您需要将数据从一个属性传递到另一个ViewModel的属性,可以使用标准的数据绑定 API,或者我们推荐DevExpressMvvm 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 method
var fluent = mvvmContext1.OfType<Form1ViewModel>();
fluent.SetBinding(labelControl1, l => l.Text, x=>x.LabelText);
//option #2: DataBindings
Form1ViewModel viewModel = mvvmContext1.GetViewModel<Form1ViewModel>();
labelControl1.DataBindings.Add("Text", viewModel, "LabelText");

VB.NET

'ViewModel code
<POCOViewModel()>
Public Class Form1ViewModel
Public Sub New()
LabelText = "Value stored in ViewModel"
End Sub
Public Overridable Property LabelText() As String
End Class

'View code
'option #1 (recommended): SetBinding method
Dim fluent = mvvmContext1.OfType(Of Form1ViewModel)()
fluent.SetBinding(labelControl1, Function(l) l.Text, Function(x) x.LabelText)
'option #2: DataBindings
Dim viewModel As Form1ViewModel = mvvmContext1.GetViewModel(Of Form1ViewModel)()
labelControl1.DataBindings.Add("Text", viewModel, "LabelText")
在POCO ViewModels中更新通知

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

什么是POCO视图模型?

在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 String
Public Overridable Property ID() As Integer
Get
Return _privateID
End Get
Protected Set(ByVal value As Integer)
_privateID = value
End Set
End 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 String
Get
Return name_field
End Get
Set(ByVal value As String)
name_field = value
End Set
End Property

Bindable Properties demo中,一个Label显示了TextEdit编辑器的值。TextEdit绑定到自动实现的虚拟Text属性(存储原始编辑器值),而Label绑定到Title(存储格式化的“Text”值)。

由于“Text”属性遵循POCO命名约定,因此TextEdit-to-Text绑定有两种方式:当ViewModel属性更改时编辑器更新其值,当用户修改编辑器文本时ViewModel属性更新其值。Label-to-Title绑定是单向的,因为“Title”属性没有公共设置方法。在此设置中,我们不需要“Title”的双向绑定,因为用户无法更改标签文本。

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

C#

//View code
var fluent = mvvmContext.OfType<ViewModel>();
fluent.SetBinding(editor, ed => ed.EditValue, x => x.Text);
fluent.SetBinding(label, lbl => lbl.Text, x => x.Title);

//ViewModel code
public 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 code
Dim 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 code
Public Class ViewModel
Public Overridable Property Text() As String
Public ReadOnly Property Title() As String
Get
If Text Is Nothing Then
Return "Title: (Null)"
End If
If Text.Length = 0 Then
Return "Title: (Empty)"
End If
If String.IsNullOrWhiteSpace(Text) Then
Return "Title: (Whitespace)"
End If
Return "Title: " & Text
End Get
End Property
End Class

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

DevExpress WinForm | 下载试用

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

更多DevExpress线上公开课、中文教程资讯请上中文网获取

DevExpress 增值服务火热销售中

免责声明:文章转载自《DevExpress WinForm MVVM数据和属性绑定指南(Part 1)》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇小程序开发笔记【四】,集成高德地图进行逆地址解析使用迁移学习(Transfer Learning)完成图像的多标签分类(Multi-Label)任务下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

(八)Asp.NET中三层架构的应用

一、 什么是三层架构? 生活中的三层 初始结构: 在现实生活中,如果老王开了一家饭店,前期顾客比较少,自己来招待客人、在后厨炒菜、每天去市场采购食材。但是随着顾客量的增加,饭店的生意越来越兴隆,自己一个人单干忙的不可开交。就好比我们的软件系统一样,我们的用户是浏览我们的网页的,主要的功能是体现在UI层面,用户和系统产生交互,UI层面需要接收用户的数据信...

Java之数据字典实现

数据字典核心代码实现: @Component public classDictMap { @Autowired privateSysDictDataMapper dictDataMapper; private static HashMap<String, String> hashMap = new HashMap<...

MD5Helper辅助类

DES加密和解密 public classMD5Helper { ///DES加密 ///sKey public string MD5Encrypt(string pToEncrypt, stringsKey) { DESCryp...

C++ Primer学习笔记

目录 12.1 动态内存与智能指针 12.1.1 shared_ptr类 12.1.2 直接管理内存 12.1.3 shared_ptr和new结合使用 12.1.4 智能指针和异常 12.1.5 unique_ptr 12.1.6 weak_ptr 12.2 动态数组 12.2.1 new和数组 12.2.2 alllocator类...

Winform记录日志信息(Serilog.AspNetCore)

1.注意:必须使用.net Core以上版本的winform才能使用,.Net4.X系列无法使用,建议使用.Net 5创建。 2. 添加ASP.NET Core、Serilog支持   2.1 Nuget 安装相关Nuget包   Microsoft.Extensions.Hosting要指定版本,不能高于2.2.0: Install-Package...

scala对复杂json的处理

本次代码主要侧重为flink stream流解析cannal-json,经过多次实验,发现还是阿里的fastjson较为好用,故在此做记录 将依赖引入 <dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId&g...