我剛開始使用Caliburn Micro。我想要一個帶有字符串列表的組合框,並且當用戶選擇一個項目時,我想要一些通知方法。它應該很簡單,對吧?我很不耐煩,並且5分鐘的谷歌搜索還沒有爲我解決它,所以Stackers來救援!如何捕獲Caliburn Micro中的combobox選擇?
注:我贊成一個答案,告訴我如何將它放入視圖模型。避免複雜的XAML是一個MVVM框架的重點,恕我直言。
我剛開始使用Caliburn Micro。我想要一個帶有字符串列表的組合框,並且當用戶選擇一個項目時,我想要一些通知方法。它應該很簡單,對吧?我很不耐煩,並且5分鐘的谷歌搜索還沒有爲我解決它,所以Stackers來救援!如何捕獲Caliburn Micro中的combobox選擇?
注:我贊成一個答案,告訴我如何將它放入視圖模型。避免複雜的XAML是一個MVVM框架的重點,恕我直言。
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
。
這應該是IMO接受的答案。這擺脫了XAML中令人討厭的綁定代碼,該代碼命名ViewModel中的事件函數,並依賴於Caliburn.Micro的約定。 +1給你,先生。 – 2011-05-16 12:20:52
我同意 - 非常明確的解釋,謝謝。 – 2011-05-16 16:17:50
+1 - 這是清晰和簡潔的答案,這讓我很高興我在... ... – 2012-02-02 10:02:47
<ListBox x:Name="Items" ItemsSource="{Binding Path=Items}" cal:Message.Attach="[Event SelectionChanged]=[Action SelectedItemChanged($this.SelectedItem)]">
也就是說很多XAML來處理一個事件。我認爲Caliburn的重點是使用約定來減少所有的混亂。 – 2011-04-29 21:36:54
你是對的,它可以用很少的xaml來完成;) – Bas 2011-04-29 21:44:34
cal在這裏的定義是什麼? – 2011-04-29 22:35:20
另一個相當優雅的解決方案在這裏提出: http://stackoverflow.com/questions/4041233/binding-selectionchanged-to-viewmodel-using-caliburn-micro – buckley 2011-12-16 11:38:28