2010-10-28 29 views
13

Wir verwenden Caliburn.Micro auf einem neuen Silverlight-Projekt und alles funktioniert gut. Die eingebauten Konventionen binden buttons click-Ereignisse an das viewModel, aber ich bin mir nicht sicher, was der beste Weg ist, das selectionChanged-Ereignis auf Datagrids und Comboboxen zu handhaben.Binding SelectionChanged zu ViewModel mit Caliburn.Micro

Momentan bin ich an das ausgewählte Element gebunden und habe eine benutzerdefinierte Logik aufgerufen, aber ich habe das Gefühl, dass es sich um einen Code-Geruch handelt und dass ich die Einstellung der Eigenschaft und des selectedChange-Ereignisses trennen sollte. Aber wenn ich diese getrennt habe, wie binde ich das selection changed Ereignis an mein viewModel, durch Befehle? oder ein EventTrigger? Oder ist der Code unter akzeptabel? Es ist eine kleine Veränderung, aber ich mache diese Logik überall.

private Foo _selectedFoo; 
public Foo SelectedFoo 
{ 
    get 
    { 
     return _Foo; 
    } 
    set 
    { 
     if (_Foo != null && _Foo.Equals(value)) return; 
     _Foo = value; 
     NotifyOfPropertyChange("SelectedFoo"); 
     NotifyOfPropertyChange("CanRemove"); 
     LoadRelatedBars(); 
    } 
} 

Antwort

16

Ich benutze diese Technik regelmäßig und fühle mich sehr wohl damit.
Ich finde völlig in Ordnung, dass die VM auf ihren eigenen Zustandswechsel reagiert, ohne dass der externe Akteur (der übrigens die View ist, aber auch eine andere Komponente sein könnte) den neuen Zustand setzt, DANN signalisiert der VM, dass der Zustand ist verändert.

Wenn Sie aber wirklich, wollen, können Sie die Message.Attach angebracht Eigenschaft verwenden können in der VM im Blick auf eine Aktion eines Ereignisses Haken:

cal:Message.Attach="[Event SelectionChanged] = [OnSelectionChangedAction]" 

(siehe auch http://caliburnmicro.codeplex.com/wikipage?title=All%20About%20Actions)

-1

Hier ist ein Beispiel für MVVM und Caliburn.Micro mit. Einige Aktionen wie SelectionChanged sollten explizit eine Ereignisargumentation erhalten, daher sollten Sie sie in caliburn event action part setzen. Das häufigste erste Argument ist die Übergabe von $ this (dem eigentlichen ui-Element, an das die Aktion angehängt ist.) Und Sie erhalten einen Datenkontext für die Zeile, aber um zum Grid zu gelangen, sollten Sie $ source als erstes Argument übergeben ($ source). ist das eigentliche FrameworkElement, das die zu sendende ActionMessage ausgelöst hat). Gemäß der Anleitung Caliburn manual.

XAML

cal:Message.Attach="[Event SelectionChanged]=[Action DataGrid_JobTypesSelectionChanged($source,$eventArgs)];" 

Code:

public void DataGrid_JobTypesSelectionChanged(object sender, SelectionChangedEventArgs e) 
    { 
     var grid = sender as DataGrid; 
     JobTypesSelectedCollection = grid.SelectedItems.Cast<JobComplexModel>().ToList(); 
    } 
+0

Willkommen bei SO! Erläutern Sie die Gründe für den OP-Code. Nicht nur das "Wie", sondern das "Warum". – garfbradaz

Verwandte Themen