Einige neue Templates in Visual Studio 2013 Windows Store Apps enthalten bereits Hilfsklassen. Dazu gehören Hub-APP, Raster-App und Split-App. Es fallen auch einige Klassen weg wie Bindablebase oder LayoutAwarePage. Neu hinzugekommen sind NavigationHelper oder SuspensionManager.
Hier wird das RelayCommand betrachtet. Wer mit leerer App startet, kopiert einfach die Klasse ins Projekt. Darin befindet sich eine Implementierung des ICommand Interfaces. Per ICommand wird in WinRT MVVM Command Binding realisiert. Das typische Button Click Event landet dann im ViewModel und nicht in der Page.
1: Namespace Common
2: ''' <summary>
3: '''
4: ''' </summary>
5: ''' <remarks></remarks>
6: Public Class RelayCommand
7: Implements ICommand
8: Private ReadOnly _execute As Action
9: Private ReadOnly _canExecute As Func(Of Boolean)
10:
11: Public Sub New(execute As Action)
12: Me.New(execute, Nothing)
13: End Sub
14:
15: Public Sub New(execute As Action, canExecute As Func(Of Boolean))
16: If execute Is Nothing Then
17: Throw New ArgumentNullException("execute")
18: End If
19: _execute = execute
20: _canExecute = canExecute
21: End Sub
22: Public Event CanExecuteChanged As EventHandler
23: Implements ICommand.CanExecuteChanged
24: Public Sub RaiseCanExecuteChanged()
25: RaiseEvent CanExecuteChanged(Me, EventArgs.Empty)
26: End Sub
27: Public Function CanExecute(parameter As Object) As Boolean
28: Implements ICommand.CanExecute
29: Return If(_canExecute Is Nothing, True, _canExecute())
30: End Function
31: Public Sub Execute(parameter As Object) Implements ICommand.Execute
32: _execute()
33: End Sub
34: End Class
35:
36: End Namespace
Satt dem Click Handler im “Codebehind” wird ein einfaches Property in einer Klasse angelegt (gern ViewModel genannt). Hier im VB.NET Code Beispiel mit einer namenlosen Methode (auch Lambda genannt).
1: Imports first81.Common
2: Imports Windows.UI.Popups
3:
4: Public Class fuuVM
5: Public Property Button1 As New RelayCommand(Async Sub()
6: Dim msg = New MessageDialog("hallo Welt")
7: Await msg.ShowAsync
8: End Sub)
9: End Class
Natürlich kann man auch eine klassische Sub per Addressof eingebunden werden. Dann eben mit Namen, hier myClick.
1: Public Property Button1 As New RelayCommand(AddressOf myClick)
2:
3: Private Async Function myClick() As Task
4: Dim msg = New MessageDialog("hallo Welt")
5: Await msg.ShowAsync
6: End Function
Nur mehr mittelspannend ist die des Buttons per Bindung im XAML per Markup Extension.
1: <Page.DataContext>
2: <local:fuuVM/>
3: </Page.DataContext>
4:
5: <Grid >
6: <Button Content="Button" Command="{Binding Button1}" />
7:
8: </Grid>