UserControl ComboBox не обновляется - PullRequest
0 голосов
/ 13 июня 2018

Я создал 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>

CodeBeh за ComboBox UserControl :

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, и элементы корректно обновляются, но когда я нажимаю в графическом интерфейсе пользователя навыпадающий список, старые элементы все еще там, и ничего не обновлено.

1 Ответ

0 голосов
/ 13 июня 2018

Вы переопределяете значение _defaultItems.Это не то, что делает Observable in ObservableCollection.Вы должны постоянно сохранять коллекцию instance одинаковой, и только Add () и Remove () из нее.

Один из способов полной замены старой коллекции новой:

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

Обратите внимание, что это неэффективно, и ObservableCollection будет обновлять представление при каждом добавлении элемента.Есть способы обойти это, например, приостановка уведомлений до завершения AddRange.

...