MVVM / ObservableCollection Вопрос - PullRequest
       3

MVVM / ObservableCollection Вопрос

4 голосов
/ 26 февраля 2011

У меня есть следующий XAML:

   <Grid x:Name="LayoutRoot">
        <sdk:DataGrid AutoGenerateColumns="True" Margin="46,38,0,40" x:Name="FamilyListGrid" HorizontalAlignment="Left" Width="475" 
               ItemsSource="{Binding FamilyList}"
               SelectedItem="{Binding SelectedFamily, Mode=TwoWay}" />
    </Grid>

Моё свойство FamilyList, используемое в Binding, - это ObservableCollection сущностей в моем классе модели представления. Я обнаружил, что мне нужно реализовать INotifyPropertyChanged в установщике моей коллекции FamilyList, иначе привязка не работает. Насколько я понимаю, ObservableCollection уже реализовал это. Если это так, зачем мне нужно реализовывать свойство notify?

Если это поможет, вот мое определение свойства FamilyList:

    private ObservableCollection<Services.Family> familyList;
    public ObservableCollection<Services.Family> FamilyList
    {
        get { return familyList; }
        private set 
        { 
            familyList = value;
            NotifyPropertyChanged("FamilyList");
        }
    }

Ответы [ 6 ]

6 голосов
/ 26 февраля 2011

ObservableCollection<T> реализует INotifyCollectionChanged, который сообщает зарегистрированному обработчику событий об изменениях в коллекции (добавление, удаление, сортировка элементов).Однако DataGrid должен знать, изменилось ли свойство одного из ваших бизнес-объектов, чтобы обновить значение в сетке.Для этого необходимо INotifyPropertyChanged.
ObservableCollection<T> также реализует INotifyCollectionChanged.Однако это можно использовать только для информирования, если свойство коллекции было изменено.Не существует механизма, который позволял бы коллекции обнаруживать, был ли изменен ваш бизнес-объект (и если бы он это сделал, он зарегистрировался бы в INotifyCollectionChanged вашего бизнес-объекта:).

2 голосов
/ 26 февраля 2011

ObservableCollection знает, как уведомлять об изменении коллекции, т.е. элемент добавляется или удаляется.

однако, если вы делаете следующее:

FamilyList = new ObservableCollection<FamilyList>(); 
// or
FamilyList = GetFamilyList();

тогда вы фактически меняете свойство, которое содержит вашу коллекцию, иное. Я предполагаю, что это проблема здесь.

1 голос
/ 26 февраля 2011

Пока свойство, содержащее коллекцию, было создано до того, как список будет привязан / DataContext установлен, у вас должно быть все в порядке.Если коллекция заменена, как говорит @Phil Sandler, вы должны уведомить об этом.Если вы создаете, вы выполняете только новый при объявлении переменной или внутри конструктора класса, вам не нужно изменять свойство notify для свойства , которое .Если вам нужно очистить список, я бы порекомендовал использовать метод очистки коллекции, а не заменять его.

1 голос
/ 26 февраля 2011

Реализация INotifyPropertyChanged в ObservableCollection в основном используется для реагирования на добавление или удаление из этой коллекции.

Вам необходимо вызвать Notify ... () в установщике, поскольку коллекция является свойством вашейViewModel и DataGrid не будут реагировать на любые изменения свойств вашего ViewModel, если только вы не вызовете Notify ... () при изменении.

Редактировать: я слишком медленный.

0 голосов
/ 26 февраля 2011

Вам не нужно уведомлять, если сама коллекция добавляет или удаляет элементы.Однако, если вы меняете всю коллекцию новым / другим экземпляром (например, familyList = new ObservableCollection<Services.Family>()), вам необходимо уведомить об этом.Если вы действительно меняете экземпляр, рассмотрите возможность очистки / повторного заполнения коллекции.

0 голосов
/ 26 февраля 2011

Вы изменяете экземпляр наблюдаемой коллекции, а не содержимое наблюдаемой коллекции. Так что коллекции не о чем уведомлять.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...