• DevExpress WinForm MVVM数据和属性绑定指南(Part 1)


    根据您绑定的属性,存在以下三种可能的情况:

    • 常规绑定 - ViewModel属性绑定到任何不可编辑的View元素属性。由于该元素不可编辑,因此您无需将更新通知发送回绑定属性(单向绑定)。
    • 数据绑定 - Model属性(数据字段)绑定到编辑器属性。如果用户可以更改编辑器值,则需要更新绑定属性(双向绑定)。
    • 属性依赖 - 来自同一个ViewModel的两个属性被绑定。

    获取工具下载 - DevExpress WinForm v21.1

    常规绑定

    如果您需要将数据从一个属性传递到另一个ViewModel的属性,可以使用标准的数据绑定 API,或者我们推荐DevExpress Mvvm Context.Set绑定方法。

    例如,一个视图有一个没有文本的LabelControl,ViewModel有一个可绑定的字符串“LabelText”属性。使用以下任何一种方法将属性值传递给此 Label。

    WinForms MVVM - 数据和属性绑定图 1

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

    WinForms MVVM - 数据和属性绑定图 2

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

    WinForms MVVM - 数据和属性绑定图 3

    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 | 下载试用

    DevExpress WinForm拥有180+组件和UI库,能为Windows Forms平台创建具有影响力的业务解决方案。DevExpress WinForms能完美构建流畅、美观且易于使用的应用程序,无论是Office风格的界面,还是分析处理大批量的业务数据,它都能轻松胜任!

    更多DevExpress线上公开课、中文教程资讯请上中文网获取

    DevExpress 增值服务火热销售中
  • 相关阅读:
    应对https协议的下载方式
    订单峰值激增 230%,Serverless 如何为世纪联华降本超 40%?|双11 云原生实践
    阿里云函数计算发布新功能,支持容器镜像,加速应用 Serverless 进程
    专访阿里云 Serverless 负责人:无服务器不会让后端失业
    从零入门 Serverless | SAE 的远程调试和云端联调
    我在阿里巴巴做 Serverless 云开发平台
    高德最佳实践:Serverless 规模化落地有哪些价值?
    [图论总结1]最大独立集(例题:Code Names)
    Excel导入SQL工具【3.02】
    学习笔记助手【2.01】base1 更新
  • 原文地址:https://www.cnblogs.com/AABBbaby/p/15427426.html
Copyright © 2020-2023  润新知