二維碼
        企資網

        掃一掃關注

        當前位置: 首頁 » 企資快訊 » 匯總 » 正文

        DevExpress_WinForm_MVVM

        放大字體  縮小字體 發布日期:2021-11-16 13:46:59    作者:葉梓盛    瀏覽次數:1
        導讀

        根據您綁定得屬性,存在以下三種可能得情況:常規綁定 - ViewModel屬性綁定到任何不可感謝得View元素屬性。由于該元素不可感謝,因此您無需將更新通知發送回綁定屬性(單向綁定)。數據綁定 - Model屬性(數據字段)

        根據您綁定得屬性,存在以下三種可能得情況:

      1. 常規綁定 - ViewModel屬性綁定到任何不可感謝得View元素屬性。由于該元素不可感謝,因此您無需將更新通知發送回綁定屬性(單向綁定)。
      2. 數據綁定 - Model屬性(數據字段)綁定到感謝器屬性。如果用戶可以更改感謝器值,則需要更新綁定屬性(雙向綁定)。
      3. 屬性依賴 - 來自同一個ViewModel得兩個屬性被綁定。

        DevExpress Universal Subscription自家蕞新版免費下載試用,歷史版本下載,在線文檔和幫助文件下載-慧都網

        屬性依賴

        屬性依賴是來自同一個ViewModel得兩個屬性之間得關系,當一個屬性發生變化時,另一個屬性會更新其值。

        在“MVVM 可靠些實踐”演示中,多個模塊演示了以下設置:

      4. 兩個TextEdit控件綁定到ViewModel“Operand1”和“Operand2”屬性。
      5. 當用戶更改 TextEdit 值時,操作數屬性會刷新其值。
      6. 當操作數屬性更改時,它們會更新數字 “Result”屬性(依賴項 #1)。
      7. “Result”屬性更新字符串“ResultText”屬性(依賴項#2)。

        對于使用示例 UI 得每個演示模塊,將 View 元素綁定到 ViewModel 屬性得代碼都是相同得。

        C#

        mvvmContext.ViewModelType = typeof(MultViewModel);var fluentAPI = mvvmContext.OfType<MultViewModel>();fluentAPI.SetBinding(editor1, e => e.EditValue, x => x.Operand1);fluentAPI.SetBinding(editor2, e => e.EditValue, x => x.Operand2);fluentAPI.SetBinding(resultLabel, l => l.Text, x => x.ResultText);

        VB.NET

        mvvmContext.ViewModelType = GetType(MultViewModel)Dim fluentAPI = mvvmContext.OfType(Of MultViewModel)()fluentAPI.SetBinding(editor1, Sub(e) e.EditValue, Sub(x) x.Operand1)fluentAPI.SetBinding(editor2, Sub(e) e.EditValue, Sub(x) x.Operand2)fluentAPI.SetBinding(resultLabel, Sub(l) l.Text, Sub(x) x.ResultText)

        然而,屬性依賴在每個模塊中得聲明都不同。

        onPropertyChanged 方法

        在POCO ViewModels中,您可以聲明OnXChanged方法,其中 X 是屬性名稱。 當相關屬性得值發生變化時,框架會調用這些方法。

        C#

        public class MultViewModel {public virtual int Operand1 { get; set; }public virtual int Operand2 { get; set; }public virtual int Result { get; set; }public virtual string ResultText { get; set; }protected void OnOperand1Changed() {UpdateResult();}protected void OnOperand2Changed() {UpdateResult();}protected void onResultChanged() {UpdateResultText();}void UpdateResult() {Result = Operand1 * Operand2;}void UpdateResultText() {ResultText = string.Format("The result is: {0:n0}", Result);}}

        VB.NET

        Public Class MultViewModelPublic Overridable Property Operand1() As IntegerPublic Overridable Property Operand2() As IntegerPublic Overridable Property Result() As IntegerPublic Overridable Property ResultText() As StringProtected Sub OnOperand1Changed()UpdateResult()End SubProtected Sub OnOperand2Changed()UpdateResult()End SubProtected Sub onResultChanged()UpdateResultText()End SubPrivate Sub UpdateResult()Result = Operand1 * Operand2End SubPrivate Sub UpdateResultText()ResultText = String.Format("The result is: {0:n0}", Result)End SubEnd Class

        自定義更新方法

        如果您得更新方法未被稱為“On...Changed”,請使用 DevExpress.Mvvm.DataAnnotations.BindableProperty 屬性告訴框架它應該在屬性值更改時調用此方法。 在下面得代碼示例中,DevExpress.Mvvm.POCO.RaisePropertyChanged 是一個 DevExpress 擴展方法,它將更新通知發送到依賴屬性。

        C#

        public class SumViewModel {[BindableProperty(onPropertyChangedMethodName = "NotifyResultAndResultTextChanged")]public virtual int Operand1 { get; set; }[BindableProperty(onPropertyChangedMethodName = "NotifyResultAndResultTextChanged")]public virtual int Operand2 { get; set; }public int Result {get { return Operand1 + Operand2; }}public string ResultText {get { return string.Format("The result is: {0:n0}", Result); }}protected void NotifyResultAndResultTextChanged() {this.RaisePropertyChanged(x => x.Result);this.RaisePropertyChanged(x => x.ResultText);}}

        VB.NET

        Public Class SumViewModel<BindableProperty(onPropertyChangedMethodName := "NotifyResultAndResultTextChanged")>Public Overridable Property Operand1() As Integer<BindableProperty(onPropertyChangedMethodName := "NotifyResultAndResultTextChanged")>Public Overridable Property Operand2() As IntegerPublic Readonly Property Result() As IntegerGetReturn Operand1 + Operand2End GetEnd PropertyPublic Readonly Property ResultText() As StringGetReturn String.Format("The result is: {0:n0}", Result)End GetEnd PropertyProtected Sub NotifyResultAndResultTextChanged()Me.RaisePropertyChanged(Function(x) x.Result)Me.RaisePropertyChanged(Function(x) x.ResultText)End SubEnd Class

        依賴屬性

        使用 DevExpress.Mvvm.DataAnnotations.DependsonProperties 屬性標記依賴屬性。 請注意,與前面得示例不同,下面得代碼僅使用一個依賴項:“ResultText”取決于兩個“Operand”屬性,您不能使用此屬性創建鏈式依賴項。

        C#

        public class MultViewModelEx {public virtual int Operand1 { get; set; }public virtual int Operand2 { get; set; }[DependsonProperties("Operand1", "Operand2")]public string ResultText {get { return string.Format("The result is: {0:n0}", Operand1 * Operand2); }}}

        VB.NET

        Public Class MultViewModelExPublic Overridable Property Operand1() As IntegerPublic Overridable Property Operand2() As Integer<DependsonProperties("Operand1", "Operand2")>Public Readonly Property ResultText() As StringGetReturn String.Format("The result is: {0:n0}", Operand1 * Operand2)End GetEnd PropertyEnd Class

        metadata類

        在這種方法中,您創建自定義更新方法并使用單獨得元數據類將屬性與這些方法鏈接起來。 如果 BindableProperty 屬性按名稱引用更新方法,則 onPropertyChangedCall 方法使用 lambda 表達式來檢索方法。 重命名自定義更新方法時,元數據類顯示編譯錯誤。

        C#

        //View Model code[System.ComponentModel.DataAnnotations.metadataType(typeof(metadata))]public class SumViewModel_metaPOCO {public virtual int Operand1 { get; set; }public virtual int Operand2 { get; set; }public virtual int Result { get; set; }public string ResultText {get { return string.Format("The result is: {0:n0}", Result); }}protected void NotifyResultAndResultTextChanged() {Result = Operand1 + Operand2;this.RaisePropertyChanged(x => x.Result);this.RaisePropertyChanged(x => x.ResultText);}//metadata classpublic class metadata: ImetadataProvider<SumViewModel_metaPOCO> {void ImetadataProvider<SumViewModel_metaPOCO>.Buildmetadata(metadataBuilder<SumViewModel_metaPOCO> builder) {builder.Property(x => x.Result).DonotMakeBindable();builder.Property(x => x.Operand1).onPropertyChangedCall(x => x.NotifyResultAndResultTextChanged());builder.Property(x => x.Operand2).onPropertyChangedCall(x => x.NotifyResultAndResultTextChanged());}}}

        VB.NET

        <System.ComponentModel.DataAnnotations.metadataType(GetType(metadata))>Public Class SumViewModel_metaPOCOPublic Overridable Property Operand1() As IntegerPublic Overridable Property Operand2() As IntegerPublic Overridable Property Result() As IntegerPublic Readonly Property ResultText() As StringGetReturn String.Format("The result is: {0:n0}", Result)End GetEnd PropertyProtected Sub NotifyResultAndResultTextChanged()Result = Operand1 + Operand2Me.RaisePropertyChanged(Function(x) x.Result)Me.RaisePropertyChanged(Function(x) x.ResultText)End Sub'metadata classPublic Class metadataImplements ImetadataProvider(Of SumViewModel_metaPOCO)Private Sub ImetadataProviderGeneric_Buildmetadata(ByVal builder As metadataBuilder(Of SumViewModel_metaPOCO)) Implements ImetadataProvider(Of SumViewModel_metaPOCO).Buildmetadatabuilder.Property(Function(x) x.Result).DonotMakeBindable()builder.Property(Function(x) x.Operand1).onPropertyChangedCall(Function(x) x.NotifyResultAndResultTextChanged())builder.Property(Function(x) x.Operand2).onPropertyChangedCall(Function(x) x.NotifyResultAndResultTextChanged())End SubEnd ClassEnd Class

        集合綁定

        要使用數據源記錄填充多項目控件,請使用 SetItemsSourceBinding 方法。

        C#

        var fluentApi = mvvmContext1.OfType<ViewModelClass>();fluentApi.SetItemsSourceBinding(TargetItemSelector,SourceSelector,Matchexpression,Createexpression,Disposeexpression,Changeexpression);

        VB.NET

        Dim fluentApi = mvvmContext1.OfType(Of ViewModelClass)()fluentApi.SetItemsSourceBinding(Target ItemSelector, SourceSelector, Matchexpression, Createexpression, Disposeexpression, Changeexpression)

      8. Target - 您需要填充得目標 UI 元素。
      9. Item Selector - 一個表達式,用于檢索應從數據源填充得 UI 元素得項目集合。
      10. Source Selector - 定位數據源得表達式,其項目應用于填充目標。
      11. Match expression -將數據源項與目標子項進行比較得表達式。 當您更改或刪除數據源記錄時,框架會運行此表達式以確定是否應更新相應得 Target 集合項。
      12. Create expression - 出現新數據源記錄時創建新目標集合項得表達式。
      13. Dispose expression - 一個表達式,當它得相關數據源記錄被刪除時處理一個 Target 集合項。
      14. Change expression - 指定當匹配表達式得出此項目與數據源記錄不同時如何更新目標集合項目。

        在 MVVM 可靠些實踐演示中,以下代碼使用自定義實體類得對象填充列表框。 SetBinding 方法將感謝器得 SelectedItem 屬性與檢索相應實體對象得 ViewModel SelectedEntity 屬性綁定。

        C#

        //View codemvvmContext.ViewModelType = typeof(ViewModel);var fluentApi = mvvmContext.OfType<ViewModel>();fluentApi.SetItemsSourceBinding(listBox,lb => lb.Items,x => x.Entities,(item, entity) => object.Equals(item.Value, entity),entity => new ImageListBoxItem(entity),null,(item, entity) => {((ImageListBoxItem)item).Description = entity.Text;});fluentApi.SetBinding(listBox, lb => lb.SelectedValue, x => x.SelectedEntity);//ViewModel codepublic class ViewModel {public virtual Entity SelectedEntity { get; set; }public virtual ObservableCollection<Entity> Entities { get; set;}protected void onSelectedEntityChanged() {//"Remove" is a custom ViewModel method that deletes a selected entitythis.RaiseCanExecuteChanged(x => x.Remove());}protected void onEntitiesChanged() {SelectedEntity = Entities.FirstOrDefault();}}//Model codepublic class Entity {public Entity(int id) {this. = id;this.Text = "Entity " + id.ToString();}public int { get; private set; }public string Text { get; set; }}

        VB.NET

        'View codemvvmContext.ViewModelType = GetType(ViewModel)Dim fluentApi = mvvmContext.OfType(Of ViewModel)()fluentApi.SetItemsSourceBinding(listBox,Function(lb) lb.Items,Function(x) x.Entities,Function(item, entity) Object.Equals(item.Value, entity),Function(entity) New ImageListBoxItem(entity),Nothing,Function(item, entity) CType(item, ImageListBoxItem).Description = entity.Text)fluentApi.SetBinding(listBox, Function(lb) lb.SelectedValue, Function(x) x.SelectedEntity)'ViewModel codePublic Class ViewModelPublic Overridable Property SelectedEntity() As EntityPublic Overridable Property Entities() As ObservableCollection(Of Entity)Protected Sub onSelectedEntityChanged()'"Remove" is a custom ViewModel method that deletes a selected entityMe.RaiseCanExecuteChanged(Function(x) x.Remove())End SubProtected Sub onEntitiesChanged()SelectedEntity = Entities.FirstOrDefault()End SubEnd Class'Model codePublic Class EntityPublic Sub New(ByVal id As Integer)Me. = idMe.Text = "Entity " & id.ToString()End SubPrivate private As IntegerPublic Property () As IntegerGetReturn privateEnd GetPrivate Set(ByVal value As Integer)private = valueEnd SetEnd PropertyPublic Property Text() As StringEnd Class

        觸發器

        觸發器允許您在 ViewModel 屬性更改時修改 UI(視圖)。 在 DevExpress 演示中,復選框綁定到 ViewModel “IsActive”屬性。 當此屬性得值更改時,觸發器會更改 UI 元素(標簽)得背景顏色。

        C#

        //ViewModel codepublic class ViewModel {public virtual bool IsActive { get; set; }}//ViewModel codevar fluent = mvvmContext.OfType<ViewModel>();fluent.SetBinding(checkEdit, c => c.Checked, x => x.IsActive);fluent.SetTrigger(x => x.IsActive, (active) => {if(active)label.Appearance.BackColor = Color.LightPink;elselabel.Appearance.BackColor = Color.Empty;});

        VB.NET

        'ViewModel codePublic Class ViewModelPublic Overridable Property IsActive() As BooleanEnd Class'ViewModel codePrivate fluent = mvvmContext.OfType(Of ViewModel)()fluent.SetBinding(checkEdit, Function(c) c.Checked, Function(x) x.IsActive)fluent.SetTrigger(Function(x) x.IsActive, Sub(active)If active Thenlabel.Appearance.BackColor = Color.LightPinkElselabel.Appearance.BackColor = Color.EmptyEnd IfEnd Sub)

        DevExpress WinForm

        DevExpress WinForm擁有180+組件和UI庫,能為Windows Forms平臺創建具有影響力得業務解決方案。DevExpress WinForms能完美構建流暢、美觀且易于使用得應用程序,無論是Office風格得界面,還是分析處理大批量得業務數據,它都能輕松勝任!

      15.  
        (文/葉梓盛)
        免責聲明
        本文僅代表作發布者:葉梓盛個人觀點,本站未對其內容進行核實,請讀者僅做參考,如若文中涉及有違公德、觸犯法律的內容,一經發現,立即刪除,需自行承擔相應責任。涉及到版權或其他問題,請及時聯系我們刪除處理郵件:weilaitui@qq.com。
         

        Copyright ? 2016 - 2025 - 企資網 48903.COM All Rights Reserved 粵公網安備 44030702000589號

        粵ICP備16078936號

        微信

        關注
        微信

        微信二維碼

        WAP二維碼

        客服

        聯系
        客服

        聯系客服:

        在線QQ: 303377504

        客服電話: 020-82301567

        E_mail郵箱: weilaitui@qq.com

        微信公眾號: weishitui

        客服001 客服002 客服003

        工作時間:

        周一至周五: 09:00 - 18:00

        反饋

        用戶
        反饋

        国产成人无码18禁午夜福利p| 永久免费av无码入口国语片| 国产色无码精品视频免费| 亚洲免费日韩无码系列 | 久久久久无码精品国产app| 免费看成人AA片无码视频羞羞网 | 人妻无码精品久久亚瑟影视| 亚洲无码在线播放| 在线免费中文字幕| 高清无码中文字幕在线观看视频| 日韩人妻无码精品一专区| 日韩精品无码人妻一区二区三区 | 中文字幕日本在线观看| 亚洲人成无码网站久久99热国产| 无码少妇一区二区| 中文字幕AV中文字无码亚| 中文字幕不卡高清视频在线| 无码人妻少妇久久中文字幕蜜桃| 成人毛片无码一区二区三区| 日韩丰满少妇无码内射| 无码一区二区三区视频| 亚洲自偷自偷偷色无码中文| 日韩AV无码一区二区三区不卡毛片| 日韩精品久久无码中文字幕| 一二三四社区在线中文视频| 国产精品无码v在线观看| 日韩精品少妇无码受不了| 亚洲av无码一区二区三区乱子伦| 人妻少妇AV无码一区二区| 无码精品国产dvd在线观看9久| 日本高清不卡中文字幕免费| 最近中文字幕完整版资源| 欧美中文字幕在线| 最好看的中文字幕最经典的中文字幕视频 | 中文字幕乱码人妻一区二区三区| 无码任你躁久久久久久久| 国产在线观看无码免费视频| 人妻无码久久精品| 无码人妻精品中文字幕免费东京热| 中文字幕一区二区人妻性色| 亚洲中文久久精品无码|