WPF - перезагрузить коллекцию (с «новым») без повторного связывания элементов управления - PullRequest
0 голосов
/ 05 июля 2010

Представьте себе следующее:

class Repository
{
    private ObservableCollection<ModelClass> _allEntries;
    public ObservableCollection<ModelClass> AllEntries
    {
        get { return _allEntries; }
        set { _allEntries = value; }
    }
    public void RefreshDataFromDB()
    {
        _all = new ObservableCollection(GetMyData()); // whatever method there is
    }
}

Теперь есть пара элементов управления, которые привязываются к этой коллекции, например ::100100

<ListView ItemsSource="{Binding Repository.AllEntries, ElementName=Whatever}"/>

Теперь проблема в том, что если я вызову RefreshDataFromDB, привязки будут потеряны (по крайней мере, так кажется), поскольку _all теперь указывает на новую часть памяти, а привязки все еще используют старую ссылку. INotifyPropertyChanged не помогает мне в этом случае (например, вставка в RefreshDataFromDB не очень помогает).

Вопрос будет заключаться в том, как бы вы справились со случаем, когда вы изменили коллекцию и хотите обновить привязки ее потребителей?

1 Ответ

1 голос
/ 05 июля 2010

Да;вы не изменяете коллекцию, пользовательский интерфейс привязывается к коллекции, а затем вы заменяете ее новой.

Вы можете сделать это:

_all.Clear();
_all.AddRange(GetMyData());

Надеюсь, это поможет!


В качестве альтернативы, сделайте AllEntries (или All .. ваша номенклатура, кажется, несколько раз изменяется в сообщении;)) DependencyProperty:

public static DependencyProperty AllEntriesProperty = DependencyProperty.Register("AllEntries", typeof(ObservableCollection), typeof(MyClass));

Вам нужно сделатьсвойство get / set, смотрите здесь пример:

http://msdn.microsoft.com/en-us/library/ms752914.aspx

...