2010-10-28 90 views
13

我們已經在新的Silverlight項目上使用了Caliburn.Micro,並且所有工作都非常棒。內置約定將按鈕單擊事件綁定到viewModel,但我不確定處理datagrids和comboboxes上的selectionChanged事件的最佳方式是什麼。使用Caliburn.Micro綁定SelectionChanged到ViewModel

目前,我綁定到選定的項目和調用自定義邏輯,但我覺得這是一種代碼味道,我應該分開屬性和selectedChange事件的設置。但是,如果我分離這些,我怎麼通過命令將選擇更改的事件綁定到我的viewModel?或一個EventTrigger?或者下面的代碼可以接受?這是一個小小的變化,但我在任何地方都這樣做。

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

回答

16

我經常使用這種技術,我感覺非常舒服。
我發現虛擬機對自己的狀態變化做出反應,而不需要外部參與者(順便說一下是View,但可能是另一個組件)來設置新狀態,然後THEN發信號通知虛擬機狀態改變了。

如果你真的想,但是,你可以使用Message.Attach附加屬性鉤在視圖中的事件在虛擬機的操作:

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

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

-1

以下是MVVM和Caliburn.Micro使用的示例。像SelectionChanged這樣的一些動作應該得到一個顯式的事件參數,所以你應該把它設置在校準事件動作部分。第一個參數是傳遞$ this(動作附加到的實際ui元素),並且你在行中獲得了一個datacontext,但是要到達Grid,你應該傳遞$ source作爲第一個參數($ source - 是觸發ActionMessage發送的實際FrameworkElement)。根據手冊Caliburn manual

XAML

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

代碼:

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

歡迎SO!解釋OP代碼的原因。不僅僅是「如何」,而是「爲什麼」。 – garfbradaz 2017-07-06 13:52:27