
[英]Caliburn.Micro NotifyOfPropertyChange different way of UI Update
[英]Caliburn.Micro's NotifyOfPropertyChange in VB
因此,使用Caliburn.Micro演示了NotifyPropertyChange(属于基类PropertyChangedBase)
NotifyOfPropertyChange(() => MyPropertyName)
从逻辑上讲,MyPropertyName是某种属性。 我尚不清楚它是如何工作的,但是我想由于返回属性的匿名函数是作为参数给出的,因此CM可以做一些反射魔术来找到实际的属性名称。 比起将“ MyPropertyName”作为字符串传递要方便得多,因为这很容易出现错字。
我的问题是,如何在VB.Net中使用它? 直译是
NotifyOfPropertyChange(Function() MyPropertyName)
但这给了我
Cannot convert lambda expression to type 'string' because it is not a delegate type.
当MyPropertyName实际上不是属性,但始终似乎出现在VB中时,C#中会出现类似的错误。
可以在VB中完成吗?
不是一个实际的答案,但是由于另一个问题 ,我得到了一个变通的解决方案:通过实现一个确实接受委托的扩展方法,我能够使用NotifyOfPropertyChange
而不传递字符串文字:
(导入System.Linq.Expressions
以及System.Runtime.CompilerServices
:)
<Extension>
Public Sub NotifyOfPropertyChange(Of T)(handler As PropertyChangedBase, propertyExpression As Expression(Of Func(Of T)))
If handler IsNot Nothing Then
Dim body As MemberExpression = TryCast(propertyExpression.Body, MemberExpression)
If body Is Nothing Then Throw New ArgumentException("'propertyExpression' should be a member expression")
Dim expression As ConstantExpression = TryCast(body.Expression, ConstantExpression)
If expression Is Nothing Then Throw New ArgumentException("'propertyExpression' body should be a constant expression")
Dim target = Linq.Expressions.Expression.Lambda(expression).Compile().DynamicInvoke
handler.NotifyOfPropertyChange(body.Member.Name)
End If
End Sub
这样我就可以使用了
NotifyOfPropertyChange(Function() MyPropertyName)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.