Wie man CodeBehind WPF -Ereignisse übersetzt; Ereignis, Handler, Ereignisserter zum MVVM -Muster?
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;
}
}
Lösung
Es gibt nur wenige Daumenregeln für MVVM ....
- Dein
Models
undViewModles
sollte sich nicht beziehenSystem.Windows.Controls
Namespace. - Dein
Models
undViewModles
sollte keine Ereignisse bewältigen. VerwendenICommand
Schnittstelle dafür. 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:
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)
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]" />