2010-01-08 3 views
2

Я новичок в WPF и пытаюсь обернуть вокруг рамки WPF, что он делает и не делает для вас.Коллекции WPF и привязка данных

Чтобы прояснить это, я хотел бы знать, в чем разница между этим:

public List<MyCustomObject> MyCustomObjects 
{ 
    get { return (List<MyCustomObject>)GetValue(MyCustomObjectsProperty); } 
    set { SetValue(MyCustomObjectsProperty, value); } 
} 

public static readonly DependencyProperty MyCustomObjectsProperty = 
    DependencyProperty.Register("MyCustomObjects", typeof(List<MyCustomObject>), 
    typeof(Main), new UIPropertyMetadata(new List<MyCustomObject>())); 



и это:

public ObservableCollection<MyCustomObject> MyCustomObjects { get; set; } 

public Main() 
{ 
    MyCustomObjects = new ObservableCollection<<MyCustomObject>(); 
} 
+0

Спасибо всем за ответы. Похоже, что Круп объяснил это для меня, поэтому я пошел с ним, но я все это поддержал. Еще раз спасибо! – Vaccano

ответ

1

1:

Вы используете свойство зависимостей, чтобы «сказать» рамки, когда это свойство изменяется.Это будет иметь следующие последствия для вашего связывания:

MyCustomObjects.Add(new MyCustomObject()); //Wont update the view through databinding 
MyCustomObjects = new List<MyCustomObject>(); //Will update the view through databinding 

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

2:

Вы используете наблюдаемую коллекцию, которая реализует INotifyCollectionChanged для вас, чтобы рассказать databinding всякий раз, когда содержимое коллекции изменилось. Это будет иметь противоположные последствия, чем # 1:

MyCustomObjects.Add(new MyCustomObject()); //Will update the view through databinding 
MyCustomObjects = new ObservableCollection<MyCustomObject>(); //Won't update the view through databinding 
+0

Если я делаю ObserverableCollection, который является DependencyProperty, я получу оба? Это хорошая идея? – Vaccano

+1

Вы получите оба, да. Если это хорошая идея, зависит от ваших потребностей, но я часто ее реализовывал (хотя вместо этого я предпочитаю использовать INotifyPropertyChanged, поскольку это проще). – cwap

+0

Поскольку OP одобрил ответ, я беру на себя смелость отредактировать его, чтобы исправить некоторые неточности (INotifyPropertyChanged -> INotifyCollectionChanged и т. Д.). –

2

В первом случае, вы настраиваете Свойство зависимостей, содержащее экземпляр List<T>.

Во-вторых, вы создаете нормальное свойство CLR, но устанавливаете его как ObservableCollection<T>.

Для привязки данных WPF здесь есть некоторые отличия.

Как правило, вы хотите, чтобы все ваши свойства в DataContext (который является объектом, по умолчанию «привязывающим»), чтобы либо реализовать INotifyPropertyChanged, либо быть зависимым свойством. Это позволяет структуре привязки знать, когда к этому объекту внесены изменения. Обычно, однако, вы используете только свойство Dependency, если вы работаете с настраиваемым элементом управления - обычно лучше иметь объект, к которому привязаны ваши данные, отдельный класс, назначенный DataContext. (Подробнее см. Josh Smith on MVVM или my recent detailed post on MVVM ...)

Однако в коллекции вам также требуется, чтобы система привязки знала, когда изменяются элементы в коллекции (то есть: элемент добавляется). ObservableCollection<T> обрабатывает это путем реализации INotifyCollectionChanged.

Используя второй подход (используя ObservableCollection<T>), ваш пользовательский интерфейс может определять, когда элементы были добавлены или удалены из коллекции, а не только при назначении новой коллекции. Это позволяет вещам работать автоматически, подобно добавлению элементов ListBox, когда новый элемент добавляется в вашу коллекцию.

4

Хорошо, мы должны положить какой-то порядок в вещи, здесь есть несколько понятий, смешанных здесь.

Прежде всего, вы спрашиваете, какая разница между защищенным полем свойством и свойством зависимостей. Google будет вашим лучшим другом, однако я рекомендую этот блог по WPF в авангардном Джош Смит: Overview of dependency properties in WPF

Вкратце: свойства зависимостей поддерживают богатство, которое WPF: Styling, анимации, связывания, метаданные и многое другое.

Во-вторых, вы спрашиваете, какая разница между List и ObservableCollection. Хорошо, что последний предоставляет уведомления о изменениях (в формах событий) при любом изменении коллекции (добавление, удаление, изменение порядка, клиринг и т. Д.), А первое - нет. Вы можете прочитать больше о том, что здесь: The ObservableCollection Class

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

4

В дополнение к Aviad и ответы Рида, я хотел бы отметить серьезную ошибку в первом примере кода:

public static readonly DependencyProperty MyCustomObjectsProperty = 
    DependencyProperty.Register("MyCustomObjects", typeof(List<MyCustomObject>), 
    typeof(Main), new UIPropertyMetadata(new List<MyCustomObject>())); 

new List<MyCustomObject>(), используемые поскольку значение по умолчанию будет создано только один раз, поэтому по умолчанию все экземпляры вашего типа будут иметь один и тот же экземпляр List<MyCustomObject>, который, вероятно, не тот, который вы хотите ... Единственное разумное значение по умолчанию здесь null

+0

Итак, правда, и общая ошибка новичка. Следите за этим! –

+0

Хммм, боюсь, я этого не понимаю ... Мне нужен один список MyCustomObjects. Я не делаю больше одного экземпляра переменной MyCustomObjects (вы ссылаетесь на «все экземпляры», но не мог бы я иметь только один экземпляр, объявленный в моем свойстве). Надеюсь, вы ответите, потому что я могу сказать, что это важно, но я просто не понимаю. – Vaccano

+0

Тот же экземпляр списка будет использоваться всеми вашими объектами типа 'Main' (если явно не указано иначе). –

Смежные вопросы