2011-04-29 38 views
21

我剛開始使用Caliburn Micro。我想要一個帶有字符串列表的組合框,並且當用戶選擇一個項目時,我想要一些通知方法。它應該很簡單,對吧?我很不耐煩,並且5分鐘的谷歌搜索還沒有爲我解決它,所以Stackers來救援!如何捕獲Caliburn Micro中的combobox選擇?

注:我贊成一個答案,告訴我如何將它放入視圖模型。避免複雜的XAML是一個MVVM框架的重點,恕我直言。

+0

另一個相當優雅的解決方案在這裏提出: http://stackoverflow.com/questions/4041233/binding-selectionchanged-to-viewmodel-using-caliburn-micro – buckley 2011-12-16 11:38:28

回答

59

Caliburn.Micro已烘焙在約定支撐ItemsControl(例如組合框或列表框)爲基礎的控制中查看哪個最小作出所需XAML。

首先您有一個標準約定,其中控件內容將與具有與控件相同名稱的ViewModel屬性綁定。在ItemsControl的情況下,控件內容屬性爲ItemsControl.ItemsSource。而Caliburn.Micro開箱的第二個約定是,將試圖將ItemsControl.SelectedItem綁定到ViewModel屬性,該屬性具有控件的單一化名稱,可以是「Active」,「Selected」或「Current」預加載(請參閱Caliburn.Micro源中的ConventionManager)。

考慮到這一點,你可以實現你想要在你查看以下內容:

<ComboBox x:Name="Strings"></ComboBox> 

,並在您的視圖模型:

public BindableCollection<string> Strings 
{ 
    get 
    { 
     // silly example of the collection to bind to 
     return new BindableCollection<string>(
         new string[]{ "one", "two", "three"});    
    } 
} 

private string _selectedString; 
public string SelectedString 
{ 
    get { return _selectedString; } 
    set 
    { 
     _selectedString= value; 
     NotifyOfPropertyChange(() => SelectedString); 
     // and do anything else required on selection changed 
    } 
} 

第一項公約拿起控件名稱(「字符串「)並將ComboBox.ItemsSource綁定到ViewModel屬性Strings。第二個約定首先將「字符串」單數化爲「字符串」並將「選定」前置以獲得屬性「SelectedString」來綁定ComboBox.SelectedItem

+0

這應該是IMO接受的答案。這擺脫了XAML中令人討厭的綁定代碼,該代碼命名ViewModel中的事件函數,並依賴於Caliburn.Micro的約定。 +1給你,先生。 – 2011-05-16 12:20:52

+0

我同意 - 非常明確的解釋,謝謝。 – 2011-05-16 16:17:50

+0

+1 - 這是清晰和簡潔的答案,這讓我很高興我在... ... – 2012-02-02 10:02:47

12
<ListBox x:Name="Items" ItemsSource="{Binding Path=Items}" cal:Message.Attach="[Event SelectionChanged]=[Action SelectedItemChanged($this.SelectedItem)]"> 
+1

也就是說很多XAML來處理一個事件。我認爲Caliburn的重點是使用約定來減少所有的混亂。 – 2011-04-29 21:36:54

+0

你是對的,它可以用很少的xaml來完成;) – Bas 2011-04-29 21:44:34

+0

cal在這裏的定義是什麼? – 2011-04-29 22:35:20

相關問題