UserControl ComboBox未更新

时间:2018-06-13 06:04:45

标签: c# .net wpf combobox user-controls

我创建了 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时,旧项目仍然存在且没有任何内容已更新。

1 个答案:

答案 0 :(得分:1)

您重写了_defaultItems的值。这不是Observable中的ObservableCollection所做的。您应该始终保持集合instance相同,并且只保留集合中的Add()和Remove()。

使用新系统完全替换旧系列的一种方法是:

// Update Method
private void UpdateList(List<String> newList)
{
    DefaultItems.Clear();
    DefaultItems.AddRange(newItems);
}

请注意,这是低效的,ObservableCollection会在每次添加项目时更新视图。有很多方法,比如暂停通知直到AddRange完成。