2010-10-28 24 views
13

Caliburn.Micro'yu yeni bir Silverlight projesinde ve her şeyin harika çalışmasında kullandık. Dahili kurallar düğmeleri tıklama olaylarını viewModel'e bağlar, ancak datagrids ve combobox'larda selectionChanged olayını işlemenin en iyi yolunun ne olduğundan emin değilim.Bağlama Seçimi Caliburn.Micro kullanarak ViewModel için değiştirildiMikro

Şu anda seçili öğeye bağlanıyorum ve özel mantığı arıyorum, ancak bunun bir kod kokusu olduğunu ve mülkün ve selectedChange olayının ayarını ayırmam gerektiğini hissediyorum. Ancak bunları ayırırsam, seçim değişmiş olayı komutlarım tarafından viewModel'e nasıl bağlarım? veya bir EventTrigger? Yoksa aşağıdaki kod kabul edilebilir mi? Onun küçük bir değişim ama ben her yerde bu mantığı yapıyorum.

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

cevap

16

Bu tekniği düzenli olarak kullanıyorum ve kendimi çok rahat hissediyorum.
VM'nin kendi durum değişikliğine tepki vermesi, harici aktöre ihtiyaç duymadan (ki bu da tesadüfen Görünüştür, ama başka bir bileşen de olabilir) yeni durumu belirlemek için o kadar iyi. Durum değişti. Gerçekten, ancak, VM bir eyleme görünümünde bir olay kanca Message.Attach ekli özelliğini kullanabilirsiniz istiyorsanız

:

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

(ayrıca http://caliburnmicro.codeplex.com/wikipage?title=All%20About%20Actions bakınız)
-1

MVVM ve Caliburn.Micro'nun kullanımı için bir örnek. SelectionChanged gibi bazı eylemler açık bir etkinlik argümanı almalıdır, bu yüzden bunu caliburn olay eylemi bölümüne ayarlamalısınız. Sıklıkla ilk argüman $ (Bu eylemin eklendiği gerçek ui öğesi) $ değerini iletir ve işleyiciye satır için bir datacontext alır, ancak Grid'e ulaşmak için ilk argüman olarak $ source vermelisiniz ($ source - gönderilecek ActionMessage'ı tetikleyen gerçek FrameworkElement öğesidir. Kılavuza göre Caliburn manual.

XAML

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

Kodu:

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

Hoşgeldin SO için! OP için kodun nedenlerini açıklar. Sadece "Nasıl" değil, "Neden". – garfbradaz