欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

DevExpress WinForm应用界面开发 - MVVM的惯例和属性使用 MVVMDevExpressWinFormC# 

程序员文章站 2022-06-02 09:29:02
...

MVVM框架以自己的方式处理您的应用程序代码并解释特定的代码片段,例如如果语法正确,则属性可以被视为可绑定,这些语法规则称为惯例。惯例允许您避免编写额外的代码,因为框架将“理解”您对它的期望并自动生成所需的一切。本文档收集了您在构建MVVM应用程序时需要注意的所有MVVM框架惯例。

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

可绑定属性

所有公共自动实现的虚拟属性都被视为可绑定的。

C#

 

public virtual string Test { get; set; }

 

VB.NET

 

Public Overridable Property Test() As String

 

要禁止为此类属性生成可绑定属性,请按如下方式使用 Bindable 属性。

C#

 

[Bindable(false)]
public virtual string Test { get; set; }

 

VB.NET

 

<Bindable(False)>
Public Overridable Property Test() As String

 

框架会忽略带有支持字段的属性,您可以使用 BindableProperty 特性显式标记此类属性,以便仍然能够将它们用于数据绑定。

C#

 

using DevExpress.Mvvm.DataAnnotations;
//. . .
string test;
[BindableProperty]
public virtual string Test
{
get { return test; }
set { test = value; }
}

 

VB.NET

 

Imports DevExpress.Mvvm.DataAnnotations
'. . .
Private testField As String
<BindableProperty>
Public Overridable Property Test() As String
Get
Return testField
End Get
Set(ByVal value As String)
testField = value
End Set
End Property

 

属性依赖

属性可以在应用程序运行时更改其值,要跟踪这些更改并对其做出响应,请声明属性依赖项。属性依赖是一种在其相关属性发生变化或即将发生变化时自动执行的方法。 要实现此操作,必须调用On<Related_Property_Name>Changing或On<Related_Property_Name>Changed方法。

C#

 

public virtual string Test { get; set; }
protected void OnTestChanged() {
//do something
}

 

VB.NET

 

Public Overridable Property Test() As String
Protected Sub OnTestChanged()
'do something
End Sub

 

On...Changed 和 On..Changing 方法也可以有一个参数,在这种情况下,参数将分别接收旧的或新的属性值。

C#

 

public virtual string Test { get; set; }
protected void OnTestChanging(string newValue) {
//do something
}
protected void OnTestChanged(string oldValue) {
//do something
}

 

VB.NET

 

Public Overridable Property Test() As String
Protected Sub OnTestChanging(ByVal newValue As String)
'do something
End Sub
Protected Sub OnTestChanged(ByVal oldValue As String)
'do something
End Sub

 

BindableProperty 属性也允许您使用具有不同名称的方法。

C#

 

[BindableProperty(OnPropertyChangingMethodName = "BeforeChange", OnPropertyChangedMethodName = "AfterChange")]
public virtual string Test { get; set; }

protected void BeforeChange() {
//. . .
}
protected void AfterChange() {
//. . .
}

 

VB.NET

 

<BindableProperty(OnPropertyChangingMethodName := "BeforeChange", OnPropertyChangedMethodName := "AfterChange")>
Public Overridable Property Test() As String

Protected Sub BeforeChange()
'. . .
End Sub
Protected Sub AfterChange()
'. . .
End Sub

 

命令

在 POCO ViewModels 中声明的所有具有零个或一个参数的公共无效方法都被视为命令。

C#

 

public void DoSomething(object p) {
MessageBox.Show(string.Format("The parameter passed to command is {0}.", p));
}

 

VB.NET

 

Public Sub DoSomething(ByVal p As Object)
MessageBox.Show(String.Format("The parameter passed to command is {0}.", p))
End Sub

 

名称以 ...Command 结尾的方法会引发异常,您可以通过使用 Command 属性标记这些方法并通过 Name 参数设置适当的名称来强制框架将这些方法视为有效命令。

C#

 

using DevExpress.Mvvm.DataAnnotations;
[Command(Name="DoSomething")]
public void DoSomethingCommand(object p) {
//do something
}

 

VB.NET

 

Imports DevExpress.Mvvm.DataAnnotations
<Command(Name := "DoSomething")>
Public Sub DoSomethingCommand(ByVal p As Object)
'do something
End Sub

 

对于每个命令方法,框架都会生成相应的支持属性。 默认情况下,此属性以相关方法加上“Command”后缀命名。 您可以使用 Command 属性的 Name 参数为这个自动生成的支持属性保留另一个名称。

C#

 

[Command(Name = "MyMvvmCommand")]
public void DoSomething(object p) {
//do something
}

 

VB.NET

 

'this command will be executed only if "p" equals 4
Public Sub DoSomething(ByVal p As Integer)
MessageBox.Show(String.Format("The parameter passed to command is {0}.", p))
End Sub
Public Function CanDoSomething(ByVal p As Integer) As Boolean
Return (2 + 2) = p
End Function

 

具有其他名称的 CanExecute 方法仍然可以通过使用 Command 属性的 CanExecuteMethodName 参数绑定到命令。

C#

 

[Command(CanExecuteMethodName = "DoSomethingCriteria")]
public void DoSomething(int p) {
MessageBox.Show(string.Format("The parameter passed to command is {0}.", p));
}
public bool DoSomethingCriteria(int p) {
return (2 + 2) == p;
}

 

VB.NET

 

<Command(CanExecuteMethodName := "DoSomethingCriteria")>
Public Sub DoSomething(ByVal p As Integer)
MessageBox.Show(String.Format("The parameter passed to command is {0}.", p))
End Sub
Public Function DoSomethingCriteria(ByVal p As Integer) As Boolean
Return (2 + 2) = p
End Function

 

当命令刚刚绑定到它的目标(以获取目标的初始状态)时,首先检查 CanExecute 子句。 稍后,每次 CanExecuteChanged 事件通知命令的目标有关命令状态更改时,都会重新计算此条件。 此事件是在底层命令对象级别声明的,要从 ViewModel 级别发送此类通知,请按如下方式调用 RaiseCanExecuteChanged 扩展方法。

C#

 

//a bindable property
public virtual bool IsModified { get; protected set; }

//a command
public void Save() {
//. . .
}

//a CanExecute condition
public bool CanSave() {
return IsModified;
}

//the OnChanged method calls the RaiseCanExecuteChanged method for the "Save" command
//this forces the command to update its CanExecute condition
public void OnIsModifiedChanged() {
this.RaiseCanExecuteChanged(x=>x.Save());
}

 

VB.NET

 

'a bindable property
Private privateIsModified As Boolean
Public Overridable Property IsModified() As Boolean
Get
Return privateIsModified
End Get
Protected Set(ByVal value As Boolean)
privateIsModified = value
End Set
End Property

'a command
Public Sub Save()
'. . .
End Sub

'a CanExecute condition
Public Function CanSave() As Boolean
Return IsModified
End Function

'the OnChanged method calls the RaiseCanExecuteChanged method for the "Save" command
'this forces the command to update its CanExecute condition
Public Sub OnIsModifiedChanged()
Me.RaiseCanExecuteChanged(Sub(x) x.Save())
End Sub

 

服务

为了解析服务,框架会覆盖接口类型的虚拟属性,这些属性的名称必须以 ...Service 结尾。

C#

 

public virtual IMyNotificationService MyService {
get { throw new NotImplementedException(); }
}

public virtual IMyNotificationService AnotherService {
get { throw new NotImplementedException(); }
}

 

VB.NET

 

Public Overridable ReadOnly Property MyService() As IMyNotificationService
Get
Throw New NotImplementedException()
End Get
End Property

Public Overridable ReadOnly Property AnotherService() As IMyNotificationService
Get
Throw New NotImplementedException()
End Get
End Property

 

您还可以使用 ServiceProperty 属性显式标记具有其他名称的服务属性。

C#

 

using DevExpress.Mvvm.DataAnnotations;
//. . .
[ServiceProperty]
public virtual IMyNotificationService MyProvider {
get { throw new NotImplementedException(); }
}

 

VB.NET

 

Imports DevExpress.Mvvm.DataAnnotations
'. . .
<ServiceProperty>
Public Overridable ReadOnly Property MyProvider() As IMyNotificationService
Get
Throw New NotImplementedException()
End Get
End Property

 

当框架覆盖服务属性时,它会生成相应的 GetService<> 扩展方法调用。 ServiceProperty 属性允许您为此方法指定其他参数(例如,服务密钥)。

C#

 

[ServiceProperty(Key="Service1")]
public virtual IMyNotificationService Service {
get { throw new NotImplementedException(); }
}

[ServiceProperty(Key = "Service2")]
public virtual IMyNotificationService AnotherService {
get { throw new NotImplementedException(); }
}

 

VB.NET

 

<ServiceProperty(Key:="Service1")>
Public Overridable ReadOnly Property Service() As IMyNotificationService
Get
Throw New NotImplementedException()
End Get
End Property

<ServiceProperty(Key := "Service2")>
Public Overridable ReadOnly Property AnotherService() As IMyNotificationService
Get
Throw New NotImplementedException()
End Get
End Property

 

DevExpress WinForm | 下载试用

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

更多产品正版授权详情及优惠,欢迎咨询在线客服>>


DevExpress技术交流群4:715863792      欢迎一起进群讨论

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