2013-09-12 2 views
2

Насколько я знаю, существует два распространенных способа создания класса DataContext, один из них - реализовать INotifyPropertyChanged, а другой - из DependencyObject.Простой способ создания DataContext, чем реализация INotifyPropertyChanged?

Многие люди говорят, что первый способ внедрения INotifyPropertyChanged проще, и я согласен.

Но я не полностью согласен, потому что я думаю, что даже реализация INotifyPropertyChanged не достаточно простая, но очень утомительно, потому что я должен переписать каждый сеттер функцию свойств и огня события, это в основном копировать & паста & изменить вещи, которые Мне не нравится много. Это не изящно.

Так что мне любопытно, есть ли другие способы создания DataContext, например, только что из какого-то класса, и все сделано?

Я знаю, что если datacontext представляет собой коллекцию, есть очень простой способ сделать это, просто наследуйте ObservableCollection <>, который я считаю очень хорошим решением. Но как насчет других классов?

Некоторые сторонние рамки?

ответ

1

Я успешно использовал PostSharp, чтобы быстро реализовать INotifyPropertyChanged очень легко для всех моих ViewModels. Фактически, это действительно канонический пример использования Аспектов, как показано на (текущей) первой странице;

[NotifyPropertyChanged] 
public class Person 
{ 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 

    public string FullName 
    { 
     get { return this.FirstName + " " + this.LastName; } 
    } 
} 

Вы найдете много информации на этом сайте, чтобы показать вам, как это сделать.

Другой альтернативой может быть использование инфраструктуры WPF/MVVM, такой как Caliburn Micro, которая включает в себя «базовые» типы, такие как PropertyChangedBase, из которых вы можете наследовать свои ViewModels и минимизировать дублирование кода.

+1

Спасибо за упоминание этих двух фреймворков.После некоторых исследований я решил использовать [Fody/PropertyChanged] (https://github.com/Fody/PropertyChanged), который работает сейчас. – Felix

1

Вы можете использовать структуру AOP, такую ​​как Postsharp, которая позволяет просто поместить атрибут в ваш класс и который генерирует весь код клея INotifyPropertyChanged.

+0

Выглядит соблазнительно. Знаете ли вы, как этот подход влияет на производительность? На первый взгляд, он может генерировать чрезмерные события «PropertyChanged» из-за меньшего контроля над ним разработчиками. –

+1

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

0

Я бы вообще не рекомендовал это, но я упомянул об этом на случай, если вы не знаете: вам не нужно нужно для реализации свойств зависимостей или INotifyPropertyChanged для работы с данными. При привязке к свойству non-dependency, принадлежащему классу, который не реализует INotifyPropertyChanged, WPF будет автоматически прослушивать через PropertyDescriptor.AddValueChanged.

Причина, по которой это не рекомендуется, заключается в том, что PropertyDescriptor является глобальным, поэтому ссылка между ним и целью прослушивания является постоянной, что вызывает утечку памяти. См. Эту страницу: http://support.microsoft.com/kb/938416

Однако, если вы просто хотите быстро и быстро запустить демонстрационное/тестовое приложение, это работает отлично.

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