翻譯|使用教程|編輯:龔雪|2022-04-07 10:54:41.353|閱讀 334 次
概述:本文主要介紹DevExpress MVVM架構(gòu)下View Model的BindableBase,歡迎下載相關(guān)控件體驗!
# 界面/圖表報表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
相關(guān)鏈接:
類實現(xiàn) INotifyPropertyChanged 接口,并提供 API 以最少的編碼聲明可綁定屬性。
要聲明可綁定屬性,請執(zhí)行以下操作:
C#
using DevExpress.Mvvm; public class ViewModel : BindableBase { public string FirstName { get { return GetValue<string>(nameof(FirstName)); } set { SetValue(value, nameof(FirstName)); } } }
VB.NET
Imports DevExpress.Mvvm Public Class ViewModel Inherits BindableBase Public Property FirstName() As String Get Return GetValue(Of String)(NameOf(FirstName)) End Get Set(ByVal value As String) SetValue(value, NameOf(FirstName)) End Set End Property End Class
BindableBase 類公開使用 CallerMemberNameAttribute 的 GetValue 和 SetValue 重載,您不必將屬性名稱傳遞給這些方法的參數(shù),這簡化了可綁定屬性聲明:
C#
using DevExpress.Mvvm; public class ViewModel : BindableBase { public string FirstName { get { return GetValue<string>(); } set { SetValue(value); } } }
VB.NET
Imports DevExpress.Mvvm Public Class ViewModel Inherits BindableBase Public Property FirstName() As String Get Return GetValue(Of String)() End Get Set(ByVal value As String) SetValue(value) End Set End Property End Class
注意:在 .NET Framework 4.5 及更高版本中可用。
屬性值存儲在內(nèi)部字典中:
SetValue 方法返回指示屬性是否已更改的 True 或 False 值。 如果為屬性設(shè)置相同的值,SetValue 方法將返回 False,并且不會發(fā)送更改通知。
C#
using DevExpress.Mvvm; public class ViewModel : BindableBase { public string FirstName { get { return GetValue<string>(); } set { if (SetValue(value)) NotifyFullNameChanged(); else MessageBox.Show("Could not change value!"); } } }
VB.NET
Imports DevExpress.Mvvm Public Class ViewModel Inherits BindableBase Public Property FirstName() As String Get Return GetValue(Of String)() End Get Set(ByVal value As String) If Not SetValue(value) Then NotifyFullNameChanged() Else MessageBox.Show("Could not change value!") End If End Set End Property End Class
SetValue 方法具有將回調(diào)方法作為參數(shù)的重載,在更改屬性值后調(diào)用此回調(diào)。
C#
using DevExpress.Mvvm; public class ViewModel : BindableBase { public string FirstName { get { return GetValue<string>(); } set { SetValue(value, changedCallback: OnFirstNameChanged); } } void OnFirstNameChanged() { //... } }
VB.NET
Imports DevExpress.Mvvm Public Class ViewModel Inherits BindableBase Public Property FirstName() As String Get Return GetValue(Of String)() End Get Set(ByVal value As String) SetValue(value, changedCallback:= AddressOf OnFirstNameChanged) End Set End Property Sub OnFirstNameChanged() '... End Sub End Class
如果您需要為特定屬性引發(fā) INotifyPropertyChanged.PropertyChanged 事件,請使用 RaisePropertyChanged/RaisePropertiesChanged 方法。
C#
using DevExpress.Mvvm; public class ViewModel : BindableBase { public string FirstName { get { return GetValue<string>(); } set { SetValue(value, changedCallback: NotifyFullNameChanged); } } public string LastName { get { return GetValue<string>(); } set { SetValue(value, changedCallback: NotifyFullNameChanged); } } public string FullName { get { return FirstName + " " + LastName; } } void NotifyFullNameChanged() { RaisePropertyChanged(nameof(FullName)); } }
VB.NET
Imports DevExpress.Mvvm Public Class ViewModel Inherits BindableBase Public Property FirstName() As String Get Return GetValue(Of String)() End Get Set(ByVal value As String) SetValue(value, changedCallback:= AddressOf NotifyFullNameChanged) End Set End Property Public Property LastName() As String Get Return GetValue(Of String)() End Get Set(ByVal value As String) SetValue(value, changedCallback:= AddressOf NotifyFullNameChanged) End Set End Property Public ReadOnly Property FullName() As String Get Return FirstName & " " & LastName End Get End Property Private Sub NotifyFullNameChanged() RaisePropertyChanged(Function() FullName) End Sub End Class
當(dāng)一個屬性被頻繁訪問或更新時,應(yīng)用程序的性能可能會降低,因為屬性值存儲在字典中。 要提高應(yīng)用程序的性能,請將屬性值存儲在支持字段中。
C#
using DevExpress.Mvvm; public class ViewModel : BindableBase { string _FirstName; public string FirstName { get { return _FirstName; } set { SetValue(ref _FirstName, value, changedCallback: NotifyFullNameChanged); } } } VB.NET Imports DevExpress.Mvvm Public Class ViewModel Inherits BindableBase Private _FirstName As String Public Property FirstName() As String Get Return _FirstName End Get Set(ByVal value As String) SetValue(_FirstName, value, changedCallback:= AddressOf NotifyFullNameChanged) End Set End Property End Class
可綁定屬性
使用 GetProperty 和 SetProperty 方法來實現(xiàn)可綁定屬性。
C#
using DevExpress.Mvvm; public class ViewModel : BindableBase { public string FirstName { get { return GetProperty(() => FirstName); } set { SetProperty(() => FirstName, value); } } }
VB.NET
Imports DevExpress.Mvvm Public Class ViewModel Inherits BindableBase Public Property FirstName As String Get Return GetProperty(Function() FirstName) End Get Set(value As String) SetProperty(Function() FirstName, value) End Set End Property End Class
GetProperty 和 SetProperty 方法的第一個參數(shù)是一個 lambda 表達(dá)式,它返回用于標(biāo)識目標(biāo)屬性名稱的屬性。 屬性名稱是使用靜態(tài) BindableBase.GetPropertyName<T> 方法在內(nèi)部獲取的。
屬性值更改時運行自定義代碼
SetProperty 方法返回指示屬性是否已更改的 True 或 False 值。如果將該屬性設(shè)置為相同的值,SetProperty 方法將返回 False,并且不會發(fā)送更改通知。 SetProperty 方法具有將回調(diào)方法作為參數(shù)的重載,此回調(diào)在字段更改后調(diào)用。
C#
using DevExpress.Mvvm; public class ViewModel : BindableBase { public string FirstName { get { return GetProperty(() => FirstName); } set { SetProperty(() => FirstName, value, OnFirstNameChanged); } } void OnFirstNameChanged() { //... } }
VB.NET
Imports DevExpress.Mvvm Public Class ViewModel Inherits BindableBase Public Property FirstName As String Get Return GetProperty(Function() FirstName) End Get Set(value As String) SetProperty(Function() FirstName, value, AddressOf OnFirstNameChanged) End Set End Property Sub OnFirstNameChanged() '... End Sub End Class
手動引發(fā) INotifyPropertyChanged.PropertyChanged
如果您需要為特定屬性引發(fā) INotifyPropertyChanged.PropertyChanged 事件,請使用 RaisePropertyChanged/RaisePropertiesChanged 方法。
C#
using DevExpress.Mvvm; public class ViewModel : BindableBase { public string FullName { get { return string.Format("{0} {1}", FirstName, LastName); } } public string FirstName { get { return GetProperty(() => FirstName); } set { SetProperty(() => FirstName, value, OnFirstNameChanged); } } public string LastName { get { return GetProperty(() => LastName); } set { if(SetProperty(() => LastName, value)) RaisePropertyChanged(() => FullName); } } void OnFirstNameChanged() { RaisePropertyChanged(() => FullName); } }
VB.NET
Imports DevExpress.Mvvm Public Class ViewModel Inherits BindableBase Public ReadOnly Property FullName As String Get Return String.Format("{0} {1}", FirstName, LastName) End Get End Property Public Property FirstName As String Get Return GetProperty(Function() FirstName) End Get Set(value As String) SetProperty(Function() FirstName, value, AddressOf OnFirstNameChanged) End Set End Property Public Property LastName As String Get Return GetProperty(Function() LastName) End Get Set(value As String) If SetProperty(Function() LastName, value) Then RaisePropertyChanged(Function() FullName) End If End Set End Property Sub OnFirstNameChanged() RaisePropertyChanged(Function() FullName) End Sub End Class
使用帶有支持字段的屬性
當(dāng)屬性被頻繁更新時(由于從 lambda 表達(dá)式計算屬性名稱并將屬性值存儲在字典中),應(yīng)用程序性能可能會降低。 要適應(yīng)這些情況,請使用存儲變量來存儲屬性,并使用 BindableBase.GetPropertyName<T> 方法從靜態(tài)構(gòu)造函數(shù)計算一次屬性名稱。
C#
using DevExpress.Mvvm; public class ViewModel : BindableBase { static string Property1Name; static ViewModel() { Property1Name = BindableBase.GetPropertyName(() => new ViewModel().Property1); } string property1; public string Property1 { get { return property1; } set { SetProperty(ref property1, value, Property1Name); } } }
VB.NET
Imports DevExpress.Mvvm Public Class ViewModel Inherits BindableBase Shared Property1Name As String Shared Sub New() Property1Name = BindableBase.GetPropertyName(Function() New ViewModel().Property1) End Sub Dim _Property1 As String Public Property Property1 As String Get Return _Property1 End Get Set(value As String) SetProperty(_Property1, value, Property1Name) End Set End Property End Class
DevExpress WPF擁有120+個控件和庫,將幫助您交付滿足甚至超出企業(yè)需求的高性能業(yè)務(wù)應(yīng)用程序。通過DevExpress WPF能創(chuàng)建有著強(qiáng)大互動功能的XAML基礎(chǔ)應(yīng)用程序,這些應(yīng)用程序?qū)W⒂?當(dāng)代客戶的需求和構(gòu)建未來新一代支持觸摸的解決方案。 無論是Office辦公軟件的衍伸產(chǎn)品,還是以數(shù)據(jù)為中心的商業(yè)智能產(chǎn)品,都能通過DevExpress WPF控件來實現(xiàn)。
DevExpress技術(shù)交流群6:600715373 歡迎一起進(jìn)群討論
本站文章除注明轉(zhuǎn)載外,均為本站原創(chuàng)或翻譯。歡迎任何形式的轉(zhuǎn)載,但請務(wù)必注明出處、不得修改原文相關(guān)鏈接,如果存在內(nèi)容上的異議請郵件反饋至chenjj@fc6vip.cn
文章轉(zhuǎn)載自:慧都網(wǎng)