Привязать POCO к UserControl - PullRequest
2 голосов
/ 08 февраля 2009

Привет, я нахожусь в процессе написания моего первого .net GUI. Мне интересно, есть ли какой-то особый способ, которым я должен применить к моим объектам poco, чтобы они были привязаны к пользовательскому контролю. У меня есть несколько объектов, но я не могу связать их с моим пользовательским контролем.

Я где-то читал, что им нужно реализовать IBindable, но я не могу избавиться от ощущения, что кто-то уже удалил весь этот дублирующий код, который мне пришлось бы вводить во все мои классы. Есть ли способ легко связать их, или мне придется использовать наборы данных или тому подобное, чтобы это связывание легко работало. Я испытываю крайнее отвращение к наборам данных, чтобы представить некоторые другие достойные варианты; -)

Я пытаюсь привязать элементы управления пользователя из набора инструментов devexpress.

Ответы [ 3 ]

1 голос
/ 08 февраля 2009

Какая архитектура?

Для односторонней привязки вам не нужно ничего, кроме открытых свойств - и, возможно, некоторых TypeConverter реализаций для любых типов данных на заказ (struct s и т. Д.)

Для полной двусторонней привязки вам потребуется реализация событий - любая из:

  • a "публичное событие EventHandler FooChanged" для каждого свойства "Foo"
  • реализация `INotifyPropertyChanged
  • сделанная на заказ модель компонента (не ходи туда - перебор)

Для примера реализации INotifyPropertyChanged (обратите внимание, вы можете переместить часть кода для повторного использования):

public class Foo : INotifyPropertyChanged
{
    private string bar;
    public string Bar
    {
        get { return bar; }
        set { UpdateField(ref bar, value, "Bar"); }
    }
    // other properties...

    public event PropertyChangedEventHandler PropertyChanged;

    protected virtual void OnPropertyChanged(string propertyName)
    {
        if (PropertyChanged != null) PropertyChanged(this,
            new PropertyChangedEventArgs(propertyName));
    }
    protected bool UpdateField<T>(ref T field, T value,
        string propertyName)
    {
        if (!EqualityComparer<T>.Default.Equals(field, value))
        {
            field = value;
            OnPropertyChanged(propertyName);
            return true;
        }
        return false;
    }
}

Чтобы связать наборы данных (сетки и т. Д.), Проще всего использовать дженерики; в основном, minumum равен IList - но вы получаете дополнительные метаданные от индексатора public T this[int index] - которые есть у List<T>, Collection<T> и т. д. Подробнее - BindingList<T> реализует IBindingList, разрешающий события уведомления на основе коллекции (но только для INotifyPropertyChanged - не для шаблона FooChanged).

0 голосов
/ 08 февраля 2009

BindingList может использоваться для привязки к спискам общих объектов.

0 голосов
/ 08 февраля 2009

В WPF вам понадобятся INotifyPropertyChanged или Свойства зависимостей . Также посмотрите на INotifyCollectionChanged для коллекций.

...