2014-12-03 63 views
0

NotifyOfPropertyChange使用Caliburn.Micro,NotifyPropertyChange(从基类PropertyChangedBase的),因此Caliburn.Micro在VB

NotifyOfPropertyChange(() => MyPropertyName) 

证明在哪里MyPropertyName是,从逻辑上讲,某种形式的财产。我不清楚这是如何工作的,但我猜想,因为返回属性的匿名函数是作为参数给出的,所以CM可以做一些反射魔术来找到实际的属性名称。比将“MyPropertyName”作为字符串传递更方便,因为这是错字倾向。

我的问题是,我如何在VB.Net中使用它?直译是

NotifyOfPropertyChange(Function() MyPropertyName) 

但是,这给了我

Cannot convert lambda expression to type 'string' because it is not a delegate type. 

出现在C#中类似的错误时MyPropertyName实际上不是一个属性,但似乎总是出现在VB。

这可以在VB中完成吗?

回答

0

不是一个实际的答案,但我已经找到了一个变通感谢this answer on another question: 通过实施不接受委托的扩展方法,我已经能够使用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)