我刚开始使用Caliburn Micro。我想要一个带有字符串列表的组合框,当用户选择一个项目时,我希望有一个名为的notify方法。应该很简单吧?我很不耐烦,5分钟的谷歌搜索还没有为我解决,所以Stackers要救了!
注意:我赞成一个答案,告诉我如何将其放入视图模型中。避免复杂的XAML是MVVM框架的重点,恕我直言。
答案 0 :(得分:59)
Caliburn.Micro已经在支持ItemsControl
(例如ComboBox或ListBox)控件的约定中出现,这些控件在您的View中生成所需的xaml。
首先,您有标准约定,其中控件内容将绑定到与控件同名的ViewModel属性。在ItemsControl
的情况下,控件内容属性为ItemsControl.ItemsSource
。你使用Caliburn.Micro开箱即用的第二个约定是尝试将ItemsControl.SelectedItem
绑定到一个ViewModel属性,该属性具有控件的单一名称,具有“Active”,“Selected”或“当前”前置(请参阅Caliburn.Micro源中的ConventionManager
)。
请注意,您可以在视图中使用以下内容实现所需:
<ComboBox x:Name="Strings"></ComboBox>
并在您的ViewModel中:
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
}
}
第一个约定选择控件名称(“Strings”)并将ComboBox.ItemsSource
绑定到ViewModel属性Strings
。第二个约定首先将“字符串”单个化为“字符串”,并在“已选择”前面添加属性“SelectedString”以将ComboBox.SelectedItem
绑定到。
答案 1 :(得分:12)
<ListBox x:Name="Items" ItemsSource="{Binding Path=Items}" cal:Message.Attach="[Event SelectionChanged]=[Action SelectedItemChanged($this.SelectedItem)]">