Wie man CodeBehind WPF -Ereignisse übersetzt; Ereignis, Handler, Ereignisserter zum MVVM -Muster?

StackOverflow https://stackoverflow.com/questions/7816067

  •  26-10-2019
  •  | 
  •  

Frage

Ich versuche, WPF -Codebehid -Ereignisse wie Event, Handler und EventSetter in MVVM -Muster zu übersetzen. Ich darf System.Windows.Controls nicht verwenden, da ich MVVM verwende. Und ich vermeide auch die Bibliothek der Drittanbieter, um dieses Problem zu lösen.

Kann jemand erklären, wie der folgende Codebehind-Ereignis-Handler in MVVM Event-Handler konvertiert wird? Bitte erklären Sie so viel wie möglich, während Sie eine Antwort schreiben.

XAML -Code

<DataGridCheckBoxColumn Header="Select" Binding="{Binding Path=IsSelected}"> 
  <DataGridCheckBoxColumn.CellStyle> 
    <Style TargetType="DataGridCell"> 
      <EventSetter Event="MouseLeftButtonUp" Handler="ApprovedMouseUp"></EventSetter> 
    </Style> 
  </DataGridCheckBoxColumn.CellStyle> 
</DataGridCheckBoxColumn> 

Code dahinter

private void ApprovedMouseUp(object sender, MouseButtonEventArgs e) 
{ 
    if(sender is DataGridCell) 
    { 
        var temp = (sender as DataGridCell).Content; 
        if(temp is CheckBox) (temp as CheckBox).IsChecked = !(temp as CheckBox).IsChecked; 
    } 
} 
War es hilfreich?

Lösung

Es gibt nur wenige Daumenregeln für MVVM ....

  1. Dein Models und ViewModles sollte sich nicht beziehen System.Windows.Controls Namespace.
  2. Dein Models und ViewModles sollte keine Ereignisse bewältigen. Verwenden ICommand Schnittstelle dafür.
  3. RoutedCommand ist in Modellen / ViewModels nicht gültig (aufgrund von Punkt 2). Daher verwenden Delegatecommand / RelayCommand

Trotzdem sind alle oben genannten Punkte perfekt erlaubt Wenn Sie eine geschrieben haben Verhalten beigefügt in MVVM.

Andere Tipps

Sie haben ein paar Möglichkeiten:

  1. Fügen Sie den Ereignishandler in XAML bei, aber das einzige, was der Ereignishandler tut, ist das Ansichtsmodell, das in den entsprechenden Argumenten passt (es ist wichtig, keine GUI -Level -Elemente an das Ansichtsmodell zu übergeben - nur die Daten, die zur Ausführung der Aktion erforderlich sind)

  2. Verwenden Sie das EventTocommand Verhalten (hier angezeigt) zum Anhängen einer Instanz eines icommand (aus Ihrem Ansichtsmodell) einem Ereignis Ihrer Ansicht

Solange Sie nicht versuchen, diese Ereignishandler in Stilen oder Vorlagen einzurichten, würde ich empfehlen, Option Nr. 1 zu verfolgen - es gibt kein Eisengesetz, das Ihnen die Verwendung von Event -Handlern verbietet, wenn es bequem ist, solange das Ansichtsmodell tatsächlich ist, was tatsächlich ist führt alle Arbeiten aus

Bearbeiten: Option Nr. 1

private void ApprovedMouseUp(object sender, MouseButtonEventArgs e) 
{ 
    if(sender is DataGridCell) 
    { 

        var checkBox= (sender as DataGridCell).Content as CheckBox; 
        if(checkBox != null) 
        {
            var viewModel = (MyViewModel)checkBox.DataContext;
            viewModel.ToggleApprovedStatus();
        }
    } 
} 

Sie können auch verwenden Caliburn Micro Bibliotheken, um einen Handler in ViewModel an ein Ereignis in Sicht zu nehmen.

Beispielcode:

 ...  xmlns:cal="clr-namespace:Caliburn.Micro;assembly=Caliburn.Micro"....

 <Button Content="Edit" DataContext="{Binding Path=VmInstance}" 
             cal:Message.Attach="[Event Click] = [Action EditFilter]" />
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top