BindableBase类实现 INotifyPropertyChanged 接口,并提供 API 以最少的编码声明可绑定属性。
可绑定属性
要声明可绑定属性,请执行以下操作:
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 重载,您不必将属性名称传递给这些方法的参数,这简化了可绑定属性声明:
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
注意:CallerMemberNameAttribute 在 .NET Framework 4.5 及更高版本中可用。
属性值存储在内部字典中:
SetValue 方法返回指示属性是否已更改的 True 或 False 值。 如果为属性设置相同的值,SetValue 方法将返回 False,并且不会发送更改通知。
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 方法具有将回调方法作为参数的重载,在更改属性值后调用此回调。
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
手动引发 INotifyPropertyChanged.PropertyChanged
如果您需要为特定属性引发 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
使用带有支持字段的属性
当一个属性被频繁访问或更新时,应用程序的性能可能会降低,因为属性值存储在字典中。 要提高应用程序的性能,请将属性值存储在支持字段中。
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
.NET Framework 4.0 中的 BindableBase
可绑定属性
使用 GetProperty 和 SetProperty 方法来实现可绑定属性。
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 方法的第一个参数是一个 lambda 表达式,它返回用于标识目标属性名称的属性。 属性名称是使用静态 BindableBase.GetPropertyName<T> 方法在内部获取的。
属性值更改时运行自定义代码
SetProperty 方法返回指示属性是否已更改的 True 或 False 值。如果将该属性设置为相同的值,SetProperty 方法将返回 False,并且不会发送更改通知。 SetProperty 方法具有将回调方法作为参数的重载,此回调在字段更改后调用。
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
手动引发 INotifyPropertyChanged.PropertyChanged
如果您需要为特定属性引发 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
使用带有支持字段的属性
当属性被频繁更新时(由于从 lambda 表达式计算属性名称并将属性值存储在字典中),应用程序性能可能会降低。 要适应这些情况,请使用存储变量来存储属性,并使用 BindableBase.GetPropertyName<T> 方法从静态构造函数计算一次属性名称。
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+个控件和库,将帮助您交付满足甚至超出企业需求的高性能业务应用程序。通过DevExpress WPF能创建有着强大互动功能的XAML基础应用程序,这些应用程序专注于当代客户的需求和构建未来新一代支持触摸的解决方案。 无论是Office办公软件的衍伸产品,还是以数据为中心的商业智能产品,都能通过DevExpress WPF控件来实现。
DevExpress技术交流群6:600715373 欢迎一起进群讨论
目录前言滤波电路科普主要分类实际情况单位的概念常用评价参数函数型滤波器简单分析滤波电路构成低通滤波器RC低通滤波器RL低通滤波器高通滤波器RC高通滤波器RL高通滤波器部分摘自《LC滤波器设计与制作》,侵权删。前言最近需要学习放大电路和滤波电路,但是由于只在之前做音乐频谱分析仪的时候简单了解过一点点运放,所以也是相当从零开始学习了。滤波电路科普主要分类滤波器:主要是从不同频率的成分中提取出特定频率的信号。有源滤波器:由RC元件与运算放大器组成的滤波器。可滤除某一次或多次谐波,最普通易于采用的无源滤波器结构是将电感与电容串联,可对主要次谐波(3、5、7)构成低阻抗旁路。无源滤波器:无源滤波器,又称
@作者:SYFStrive @博客首页:HomePage📜:微信小程序📌:个人社区(欢迎大佬们加入)👉:社区链接🔗📌:觉得文章不错可以点点关注👉:专栏连接🔗💃:感谢支持,学累了可以先看小段由小胖给大家带来的街舞👉微信小程序(🔥)目录自定义组件-behaviors 1、什么是behaviors 2、behaviors的工作方式 3、创建behavior 4、导入并使用behavior 5、behavior中所有可用的节点 6、同名字段的覆盖和组合规则总结最后自定义组件-behaviors 1、什么是behaviorsbehaviors是小程序中,用于实现
Transformers开始在视频识别领域的“猪突猛进”,各种改进和魔改层出不穷。由此作者将开启VideoTransformer系列的讲解,本篇主要介绍了FBAI团队的TimeSformer,这也是第一篇使用纯Transformer结构在视频识别上的文章。如果觉得有用,就请点赞、收藏、关注!paper:https://arxiv.org/abs/2102.05095code(offical):https://github.com/facebookresearch/TimeSformeraccept:ICML2021author:FacebookAI一、前言Transformers(VIT)在图
遍历文件夹我们通常是使用递归进行操作,这种方式比较简单,也比较容易理解。本文为大家介绍另一种不使用递归的方式,由于没有使用递归,只用到了循环和集合,所以效率更高一些!一、使用递归遍历文件夹整体思路1、使用File封装初始目录,2、打印这个目录3、获取这个目录下所有的子文件和子目录的数组。4、遍历这个数组,取出每个File对象4-1、如果File是否是一个文件,打印4-2、否则就是一个目录,递归调用代码实现publicclassSearchFile{publicstaticvoidmain(String[]args){//初始目录Filedir=newFile("d:/Dev");Datebeg
ES一、简介1、ElasticStackES技术栈:ElasticSearch:存数据+搜索;QL;Kibana:Web可视化平台,分析。LogStash:日志收集,Log4j:产生日志;log.info(xxx)。。。。使用场景:metrics:指标监控…2、基本概念Index(索引)动词:保存(插入)名词:类似MySQL数据库,给数据Type(类型)已废弃,以前类似MySQL的表现在用索引对数据分类Document(文档)真正要保存的一个JSON数据{name:"tcx"}二、入门实战{"name":"DESKTOP-1TSVGKG","cluster_name":"elasticsear
我想开始使用“Sinatra”框架进行编码,但我找不到该框架的“MVC”模式。是“MVC-Sinatra”模式或框架吗? 最佳答案 您可能想查看Padrino这是一个围绕Sinatra构建的框架,可为您的项目提供更“类似Rails”的感觉,但没有那么多隐藏的魔法。这是使用Sinatra可以做什么的一个很好的例子。虽然如果您需要开始使用这很好,但我个人建议您将它用作学习工具,以对您来说最有意义的方式使用Sinatra构建您自己的应用程序。写一些测试/期望,写一些代码,通过测试-重复:)至于ORM,你还应该结帐Sequel其中(imho
我安装了ruby、yeoman,当我运行我的项目时,出现了这个错误:Warning:Running"compass:dist"(compass)taskWarning:YouneedtohaveRubyandCompassinstalledthistasktowork.Moreinfo:https://github.com/gruUse--forcetocontinue.Use--forcetocontinue.我有进入可变session目标的路径,但它不起作用。谁能帮帮我? 最佳答案 我必须运行这个:geminstallcom
文章目录1.任务背景2.任务目标3.相关知识点4.任务实操4.1安装配置JDK4.2启动FISCOBCOS4.3下载解压WeBASE-Front4.4拷贝sdk证书文件4.5启动节点4.6访问节点4.7检查运行状态5.任务总结1.任务背景FISCOBCOS其实是有控制台管理工具,用来对区块链系统进行各种管理操作。但是对于初学者来说,还是可视化界面更友好,本节就来介绍WeBASE管理平台,这是一款微众银行开源的自研区块链中间件平台,可以降低区块链使用的门槛,大幅提高区块链应用的开发效率。微众银行是腾讯牵头设立的民营银行,在国内民营银行里还是比较出名的。微众银行参与FISCOBCOS生态建设,一定
TCL脚本语言简介•TCL(ToolCommandLanguage)是一种解释执行的脚本语言(ScriptingLanguage),它提供了通用的编程能力:支持变量、过程和控制结构;同时TCL还拥有一个功能强大的固有的核心命令集。TCL经常被用于快速原型开发,脚本编程,GUI和测试等方面。•实际上包含了两个部分:一个语言和一个库。首先,Tcl是一种简单的脚本语言,主要使用于发布命令给一些互交程序如文本编辑器、调试器和shell。由于TCL的解释器是用C\C++语言的过程库实现的,因此在某种意义上我们又可以把TCL看作C库,这个库中有丰富的用于扩展TCL命令的C\C++过程和函数,所以,Tcl是
文章目录一、项目场景二、基本模块原理与调试方法分析——信源部分:三、信号处理部分和显示部分:四、基本的通信链路搭建:四、特殊模块:interpretedMATLABfunction:五、总结和坑点提醒一、项目场景 最近一个任务是使用simulink搭建一个MIMO串扰消除的链路,并用实际收到的数据进行测试,在搭建的过程中也遇到了不少的问题(当然这比vivado里面的debug好不知道多少倍)。准备趁着这个机会,先以一个很基本的通信链路对simulink基础和相关的debug方法进行总结。 在本篇中,主要记录simulink的基本原理和基本的SISO通信传输链路(QPSK方式),计划在下篇记