2014-12-03 2 views
0

Использование 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) 
Смежные вопросы