2014-12-10 3 views
3

Недавно я вошел в радостный мир VB.NET, но для жизни меня, похоже, не понял, почему следующее не работает.Разница между синтаксисом лямбда и адресом VB.NET

Когда я пишу этот код здесь, все хорошо:

MyNavigationCommand = New RelayCommand(AddressOf Navigate) 

Private Sub Navigate() 
    Navigator.NavigateTo(NavigationRoutes.DetailScreen) 
End Sub 

Однако, когда я пытаюсь сделать то же самое, используя синтаксис лямбда, мой код внутри лямбда не получает удар, когда я нажимаю кнопка, которая запускает команду.

Следующая строка, не работает:

MyNavigationCommand = New RelayCommand(Sub() Navigator.NavigateTo(NavigationRoutes.DetailScreen)) 

Это должно работать точно так же, как и мой предыдущий подход, не так ли? Или я чего-то не хватает?

+0

Is Navigator.NavigateTo для совместного использования или использования некоторого свойства? И что делает NavigateTo на самом деле? –

ответ

0

Я не уверен, что для вас не так. Это мой код, который я написал, чтобы проверить это:

Sub Main 

    Dim MyNavigationCommand = New RelayCommand(AddressOf Navigate) 
    Dim MyNavigationCommand2 = New RelayCommand(Sub() Console.WriteLine("!")) 

    Navigate 
    MyNavigationCommand 
    MyNavigationCommand2 

End Sub 

Public Delegate Sub RelayCommand 

Public Sub Navigate() 
    Console.WriteLine("!") 
End Sub 

При запуске этого кода производит три линии !.

+0

Как вы говорите, он работает, делая что-то простое. Однако, когда вы закрываете действие RelayCommand, оно больше не работает. Я решил проблему, она была связана с тем, как RelayCommand MVVM Light обрабатывает захваченные переменные в лямбда, переданные команде. Реализация самой ICommand и передача захваченной переменной делает трюк. Достаточно странно. – Mirage

+0

@Mirage - Можете ли вы объяснить, где вы проходите закрытие? Я не вижу разницы между 'Sub() Console.WriteLine ("! ")' И 'Sub() Navigator.NavigateTo (NavigationRoutes.DetailScreen)'. Если 'NavigationRoutes.DetailScreen' не является обычным типом? – Enigmativity

Смежные вопросы