繁体   English   中英

Caliburn.Micro在VB中的NotifyOfPropertyChange

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM