翻譯|使用教程|編輯:龔雪|2021-10-19 10:08:09.110|閱讀 273 次
概述:DevExpress WinForm創(chuàng)建的應(yīng)用程序可利用MVVM設(shè)計模式,本文主要為大家介紹這其中的第一種常規(guī)數(shù)據(jù)綁定,歡迎下載最新版體驗!
# 界面/圖表報表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
相關(guān)鏈接:
根據(jù)您綁定的屬性,存在以下三種可能的情況:
獲取工具下載 - DevExpress WinForm v21.1
如果您需要將數(shù)據(jù)從一個屬性傳遞到另一個ViewModel的屬性,可以使用標(biāo)準(zhǔn)的數(shù)據(jù)綁定 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")
如果綁定屬性的值可以更改,請務(wù)必將此更改通知相關(guān)屬性,為此請將更新通知發(fā)送到相關(guān)屬性。 如果您使用POCO ViewModels,DevExpress框架可以發(fā)送這些通知。
什么是POCO視圖模型?
在MVVM應(yīng)用中,每個View都有一個相關(guān)的ViewModel。在使用DevExpress MVVM Framework時,應(yīng)該為每個View添加一個MvvmContext組件,并將該組件指向與該View相關(guān)的ViewModel,建議在設(shè)計時通過組件的智能標(biāo)記菜單執(zhí)行此操作。
您還可以使用ViewModelType屬性在代碼中執(zhí)行此操作。
C#
mvvmContext.ViewModelType = typeof(ViewModel);
VB.NET
mvvmContext.ViewModelType = GetType(ViewModel)
框架將分配給MvvmContext組件的每個ViewModel視為POCO(Plain Old CRL Object)ViewModel。POCO ViewModels有許多命名和語法約定,如果您遵循它們,框架會預(yù)測您想要做什么并相應(yīng)地采取行動。例如,更新通知會自動發(fā)送到(來自)“正確”聲明的屬性。
創(chuàng)建一個公共虛擬自動實現(xiàn)屬性,以允許框架向該屬性發(fā)送更新通知以及從該屬性發(fā)送更新通知,還可以將屬性設(shè)置器聲明為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屬性標(biāo)記此類屬性,以便能夠綁定此類屬性。
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綁定到自動實現(xiàn)的虛擬Text屬性(存儲原始編輯器值),而Label綁定到Title(存儲格式化的“Text”值)。
由于“Text”屬性遵循POCO命名約定,因此TextEdit-to-Text綁定有兩種方式:當(dāng)ViewModel屬性更改時編輯器更新其值,當(dāng)用戶修改編輯器文本時ViewModel屬性更新其值。Label-to-Title綁定是單向的,因為“Title”屬性沒有公共設(shè)置方法。在此設(shè)置中,我們不需要“Title”的雙向綁定,因為用戶無法更改標(biāo)簽文本。
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”屬性之間的區(qū)別,并不完整。 演示模塊還使用屬性依賴來在“Text”更改時更新“Title”。
DevExpress WinForm擁有180+組件和UI庫,能為Windows Forms平臺創(chuàng)建具有影響力的業(yè)務(wù)解決方案。DevExpress WinForms能完美構(gòu)建流暢、美觀且易于使用的應(yīng)用程序,無論是Office風(fēng)格的界面,還是分析處理大批量的業(yè)務(wù)數(shù)據(jù),它都能輕松勝任!
更多產(chǎn)品正版授權(quán)詳情及優(yōu)惠,歡迎咨詢
DevExpress技術(shù)交流群4:715863792 歡迎一起進群討論
本站文章除注明轉(zhuǎn)載外,均為本站原創(chuàng)或翻譯。歡迎任何形式的轉(zhuǎn)載,但請務(wù)必注明出處、不得修改原文相關(guān)鏈接,如果存在內(nèi)容上的異議請郵件反饋至chenjj@fc6vip.cn
文章轉(zhuǎn)載自:慧都網(wǎng)