我创建了 UserControl DefaultComboBox :
<UserControl x:Class="MyProject.ComboBoxes.DefaultComboBox"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<Grid>
<ComboBox x:Name="ComboBoxDefault"
ItemsSource="{Binding DefaultItems, UpdateSourceTrigger=PropertyChanged}" />
</Grid>
</UserControl>
ComboBox UserControl的 CodeBehind :
public partial class DefaultComboBox : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
private ObservableCollection<String> _defaultItems = new ObservableCollection<String>();
public ObservableCollection<string> DefaultItems
{
get { return _defaultItems; }
set
{
_defaultItems = value;
NotifyPropertyChanged(DefaultItems);
}
}
// Constructor
public DefaultComboBox()
{
UpdateList(ExternalSource.InitialItemList);
NotifyPropertyChanged("DefaultItems");
InitializeComponent();
}
private void NotifyPropertyChanged(string propertyName)
{
if (PropertyChanged != null)
PropertyChanged.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
// Some DependencProperties like Filter
// Update Method
private void UpdateList(List<String> newList)
{
DefaultItems = new ObservableCollection<string>(newList);
NotifyPropertyChanged("DefaultItems");
}
}
以下是使用Control的一个示例:
<comboBoxes:DefaultComboBox x:Name="DefaultComboBoxUserView"
Filter="{Binding FilterString}"/>
问题:
如果我是第一次启动WPF应用程序并调用DefaultComboBox的构造函数,则UpdateList方法可以正常工作,ComboBox包含预期的项目。
如果我在运行时使用UpdateList方法,则会调用DefaultItems的setter并且项目已正确更新,但是当我在组合框下拉框中单击GUI时,旧项目仍然存在且没有任何内容已更新。
答案 0 :(得分:1)
您重写了_defaultItems的值。这不是Observable
中的ObservableCollection
所做的。您应该始终保持集合instance
相同,并且只保留集合中的Add()和Remove()。
使用新系统完全替换旧系列的一种方法是:
// Update Method
private void UpdateList(List<String> newList)
{
DefaultItems.Clear();
DefaultItems.AddRange(newItems);
}
请注意,这是低效的,ObservableCollection会在每次添加项目时更新视图。有很多方法,比如暂停通知直到AddRange完成。