DevExpress WinForm MVVM数据和属性绑定指南(Part 1)
根据您绑定的属性,存在以下三种可能的情况:
- 常规绑定 - ViewModel属性绑定到任何不可编辑的View元素属性。由于该元素不可编辑,因此您无需将更新通知发送回绑定属性(单向绑定)。
- 数据绑定 - Model属性(数据字段)绑定到编辑器属性。如果用户可以更改编辑器值,则需要更新绑定属性(双向绑定)。
- 属性依赖 - 来自同一个ViewModel的两个属性被绑定。
获取工具下载 - DevExpress WinForm v21.1
常规绑定
如果您需要将数据从一个属性传递到另一个ViewModel的属性,可以使用标准的数据绑定 API,或者我们推荐DevExpress Mvvm Context.Set绑定方法。
例如,一个视图有一个没有文本的LabelControl,ViewModel有一个可绑定的字符串“LabelText”属性。使用以下任何一种方法将属性值传递给此 Label。

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,建议在设计时通过组件的智能标记菜单执行此操作。

您还可以使用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”的双向绑定,因为用户无法更改标签文本。

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拥有180+组件和UI库,能为Windows Forms平台创建具有影响力的业务解决方案。DevExpress WinForms能完美构建流畅、美观且易于使用的应用程序,无论是Office风格的界面,还是分析处理大批量的业务数据,它都能轻松胜任!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
2020-10-20 超好用VS开发框架DevExtreme v20.1.8发布(附下载链接)
2020-10-20 DevExpress WPF让创建绑定到数据的3D图表控件变得更容易(Part 1)