翻譯|使用教程|編輯:龔雪|2021-10-19 10:08:09.110|閱讀 273 次
概述:DevExpress WinForm創建的應用程序可利用MVVM設計模式,本文主要為大家介紹這其中的第一種常規數據綁定,歡迎下載最新版體驗!
# 界面/圖表報表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
相關鏈接:
根據您綁定的屬性,存在以下三種可能的情況:
獲取工具下載 - DevExpress WinForm v21.1
如果您需要將數據從一個屬性傳遞到另一個ViewModel的屬性,可以使用標準的數據綁定 API,或者我們推薦DevExpress Mvvm Context.Set綁定方法。
例如,一個視圖有一個沒有文本的,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,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風格的界面,還是分析處理大批量的業務數據,它都能輕松勝任!
更多產品正版授權詳情及優惠,歡迎咨詢
DevExpress技術交流群4:715863792 歡迎一起進群討論
本站文章除注明轉載外,均為本站原創或翻譯。歡迎任何形式的轉載,但請務必注明出處、不得修改原文相關鏈接,如果存在內容上的異議請郵件反饋至chenjj@fc6vip.cn
文章轉載自:慧都網