RelayCommand in Windows 8.1

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.

image

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>
Kommentare sind geschlossen