2010-05-09 3 views
3

Я пытаюсь узнать больше о BindingList, потому что я считаю, что это поможет мне с проектом, над которым я работаю.Реализация BindingList <T>

В настоящее время у меня есть класс объектов (ScannedImage), который является подтипом класса (HashedImage), который подтипирует собственный .Net-объект (изображение). Нет причин, по которым я не мог бы переместить два подтипа вместе. Я просто подтипирую объект, который я ранее построил, но теперь я буду хранить свой объект ScannedImage в RDB (ну, а не технически - только детали и, возможно, миниатюру).

Кроме того, класс объекта имеет типы членов, которые являются моими собственными пользовательскими типами (ключевые слова). Я использую настраиваемый datagridview для представления этих объектов, но обрабатываю все изменения объекта ScannedImage с помощью собственного кода. Как вы можете себе представить, у меня довольно много событий для обработки, которые встречаются в этих базовых типах.

Итак, если я изменил свой объект на реализацию INotifyPropertyChanged, будет ли коллекция объектов (реализация BindingList) получать уведомления об изменениях объекта ScannedImage?

Кроме того, если ключевые слова должны были реализовать INotifyPropertyChanged, будут ли изменения доступны для BindingList через объект ScannedImage?

Извините, если это кажется довольно новичком. Я только недавно обнаружил BindingList и не имел формального обучения в программировании на C# - мне сложно продвигаться вперед.

Кроме того, если у кого-то есть хороший справочный материал, я был бы благодарен за ссылки. Очевидно, что я просмотрел библиотеку MSDN. Я нашел несколько хороших ссылок в Интернете, но кажется, что многие люди теперь используют WPF и ObservableCollection.

Мой проект основан на Winforms и .Net3.5 framework.

ТИА

+0

@Aaronaught Вы верны. Название должно быть «Реализация IBindingList» или, скорее, как вы указали (что я должен быть) «Использование BindingList с моим классом объектов, который реализует INotifyPropertChanged» – EtherealMonkey

ответ

1

Отвечу оба ваши вопросы:

[I] е я изменил объект для реализации INotifyPropertyChanged, будет ли объект коллекции (реализации BindingList) получать уведомления об изменениях в Объект ScannedImage?

Если вы на самом деле использовать BindingList<T> класс внутри System.ComponentModel, то он содержит специальные дела код для элементов, которые impelment INotifyPropertyChanged. Список будет см. Изменения свойств и будет отправлять уведомления.

Тем не менее, вы специально задаете вопрос о «внедрении BindingList», который тонко отличается. Вы не можете реализовать класс. Но есть интерфейс, IBindingList, что вы можете использовать с вашим собственным классом, и если это маршрут, который вы выбираете, то это становится вашей ответственностью, когда вы пишете класс списка, чтобы убедиться, что вы следите за уведомлениями об изменении свойств ,

Как правило, вам не нужно создавать свою собственную реализацию IBindingList; просто используйте BindingList<T>, чтобы обернуть существующий список, и все будет в порядке.

Кроме того, если ключевые слова должны были реализовывать INotifyPropertyChanged, будут ли изменения доступны для BindingList через объект ScannedImage?

Нет, они не будут. BindingList<T> рассматривает только объект , он не имеет возможности сканировать все зависимости и контролировать все на графике (и это всегда было бы хорошей идеей, если это было возможно).

Что вы будете делать, если вы хотите получать уведомления является обновлением вашего ScannedImage класса для проверки уведомлений об изменении свойства от Keywords объекта, затем огня своего PropertyChanged события в ответ.

Пример:

public class ScannedImage : INotifyPropertyChanged 
{ 
    private Keywords keywords; 

    protected void OnPropertyChanged(string propertyName) 
    { 
     PropertyChangedEventHandler handler = PropertyChanged; 
     if (handler != null) 
     { 
      PropertyChangedEventArgs e = new 
       PropertyChangedEventArgs(propertyName); 
      handler(this, e); 
     } 
    } 

    private void KeywordsChanged(object sender, PropertyChangedEventArgs e) 
    { 
     OnPropertyChanged("Keywords"); 
    } 

    private void SetKeywords(Keywords newKeywords) 
    { 
     Keywords oldKeywords = this.keywords; 
     this.keywords = null; 
     if (oldKeywords != null) 
      oldKeywords.PropertyChanged -= KeywordsChanged; 
     this.keywords = newKeywords; 
     if (newKeywords != null) 
      newKeywords.PropertyChanged += KeywordsChanged; 
    } 

    public Keywords Keywords 
    { 
     get { return keywords; } 
     set { SetKeywords(value); } 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 
} 

public class Keywords : INotfifyPropertyChanged { ... } 

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

+0

Хорошо, еще один вопрос (я полагаю, что я попробую, но я буду попросите потомство ...) Может ли мой класс ключевых слов иметь несколько объектов PropertyChangedEventHandler? Я прошу, потому что я хотел бы добавить и удалить одно ключевое слово из его списка. Хотя метод, который вы представляете, будет работать - я бы (обычно) предпочел бы добавить одно ключевое слово в список, а не рассматривать его как «неизменяемое». На самом деле, не-ум - я (думаю, что я) только понял ответ. В KeywordsChanged я должен просто проверить отправителя и выполнить переключатель типа или аргументов события - правильно? – EtherealMonkey

+0

Кроме того, да - это имеет смысл. Я ценю пример. Теперь вопрос намного яснее! – EtherealMonkey

+0

@Ethereal: Извините, я действительно не понимаю, что вы спрашиваете с этим первым вопросом. Я не могу придумать, почему вам нужно протестировать отправителя. Я думаю, что тебе что-то не хватает, но я не уверен, что; вы считаете, что строка '+ = KeywordsChanged' действительно вызывает событие? Это не так, он просто подключает обработчик событий, когда изменяются свойства * of * the 'Keywords' (как определено собственной реализацией этого свойства события изменения свойства этого класса). Вся структура специально разработана для * изменяемого * класса 'Keywords', который имеет свое собственное событие PropertyChanged. – Aaronaught