即使它不在ItemsSource中,如何显示ComboBox的SelectedItem?
就像一个简单的例子......
假设我有一个“Class”对象,上面有一个“Teacher”属性 .
public class Class: INotifyPropertyChanged
{
private Individual _teacher
public Individual Teacher
{
get { return _teacher; }
set
{
teacher = value;
RaisePropertyChanged("Teacher");
}
}
...
}
在“维护类”GUI上,有一个ComboBox可以选择一个教师,我只希望活动的个人出现在ComboBox中 . 我不希望用户能够在ComboBox中键入自由格式文本 . 为了实现这一点,我将ItemsSource绑定到我的ViewModel中的一个集合,该集合仅包含活动的个人,并且SelectedItem绑定到我的“Class”对象的Teacher属性 .
public class MaintainClasses_ViewModel:INotifyPropertyChanged
{
private ObservableCollection<Individual> _activeIndividuals
= GetAllActiveIndividuals();
public ObservableCollection<Individual> ActiveIndividuals
{
get { return _activeIndividuals
}
public Class SelectedClass
{
get;
set;
}
}
使用我的ComboBox的xaml ...
<ComboBox ItemsSource="{Binding ActiveIndividuals}"
SelectedItem="{Binding SelectedClass.Teacher}" />
现在假设我打开一个类的“维护类”GUI,其中已经保存的教师现在处于非活动状态 . 现在......我只想让活跃的个人出现在组合框-PLUS中,这是之前选择的老师(即使他们现在处于非活动状态而不是在ItemsSource中) .
目前,我发现这样做的唯一方法是将非活动个体添加到集合中,并为集合引发PropertyChanged事件 . 但是,我真的想归档这个结果而不向集合添加内容 . 优选地,一些使用xaml,选择器和/或转换器的方法 .
1 回答
这是我一直在使用的,我希望它有助于:
ComboBoxAdaptor.cs:
How To Use It In Xaml
Some Notes
如果SelectedItem更改为不在ComboBox中的值,则它将添加到ComboBox(但不是ItemsSource) . 下次通过Binding更改SelectedItem时,任何不在ItemsSource中的项目都将从ComboBox中删除 .
此外,
ComboBoxAdaptor
允许您将Null项插入到ComboBox中 . 这是一个可选功能,您可以通过在xaml中设置AllowNull="False"
来关闭它 .