Восстановление привязки данных WPF после изменения значения свойства - PullRequest
0 голосов
/ 24 сентября 2010

Я сейчас играю с ICollectionView и сталкиваюсь с проблемой, когда мне кажется, что я понимаю «почему», а не «как мне это исправить».:)

У меня есть ComboBox, привязанный к базе данных ICollectionView, и он изначально установлен со следующим кодом:

NameView = CollectionViewSource.GetDefaultView( names); // names is an IEnumerable<string> that comes from a LINQ query
NameView.CurrentChanged += new EventHandler(NameView_CurrentChanged);

Все работает отлично, пока я не выполню фрагмент кода, который генерируетnew IEnumerable<string> и снова устанавливает NameView с тем же кодом, что и выше.Как только я это сделаю, CurrentItem больше не работает должным образом.

Я сталкивался с этой проблемой раньше с привязкой данных ObservableCollection<string> к ComboBoxes, и я обошел проблему "отмены привязки", используя Clear()и Add() вместо установки свойства ObservableCollection<string> для нового ObservableCollection<string>.

Мои вопросы включают в себя: 1. Если я хочу иметь возможность просто установить свойство для новой коллекции, могу ли я-установить привязку данных с новой коллекцией как-нибудь?Если так, то как?Если нет, то можете ли вы объяснить, что за WPFisms почему это принципиально невозможно?2. Как лучше всего справляться с изменениями в ObservableCollection<string> или ICollectionView?Является ли мой подход только очисткой и добавлением единственным способом сделать это?

1 Ответ

1 голос
/ 24 сентября 2010

Когда вы связываете свои элементы управления WPF с ICollectionViews (происходит, когда XAML анализируется с вашим вызовом InitializeComponent - вы действительно должны определить привязки в XAML!), Элементы управления подписываются на требуемые события, опубликованные вашей коллекцией (например, CollectionChanged),

Ваше свойство коллекции является просто ссылкой на адрес памяти.Когда вы сгибаете это к новой коллекции (то есть к новому адресу), DataBinding не заметит.Вы не можете ожидать, что оригинальная Коллекция опубликует что-то вроде «IAmOuttaHere», и очевидно, что органы управления не будут слушать новую коллекцию, говорящую «Я новый парень».Но если я вижу это правильно, ваш фрагмент ничего не делает, кроме добавления обработчика событий в CurrentChanged (что означает, что вы наблюдаете, когда выбирается какой-то другой элемент в Combobox)

Привязка - это все об уведомлении, так что до тех пор, покаВы не говорите своим элементам управления, что коллекция была обменена, они будут придерживаться начальной коллекции.Пожалуйста, попробуйте реализовать INotifyPropertyChanged так:

    public class ViewModel : INotifyPropertyChanged
{
    private ICollectionView myCollection;

    public ICollectionView MyCollection
    {
        get
        {
            return this.myCollection;
        }
        set
        {
            this.myCollection = value;
            this.OnPropertyChanged("MyCollection");
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;

    private void OnPropertyChanged(string propertyName)
    {
        if (this.PropertyChanged != null)
        {
            this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }
    }

    public void ExchangeCollection()
    {
        this.MyCollection = new CollectionView(....)
    }

}

Любые привязки должны быть сделаны в MyCollection.Хотя лично я не определяю сами ICollectionViews, поскольку с ними не так приятно работать, как, например, с изящным IList, и они автоматически оборачиваются вокруг любой коллекции, как только определяется привязка.

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

Sebi

...