Реализация списка привязок в элементе управления - PullRequest
0 голосов
/ 12 июля 2010

У меня есть (Image) пользовательский элемент управления на Winform ..
Я хочу привязать этот элемент управления к списку привязок так, чтобы всякий раз (изображения) Коллекция изменяет элемент управления (изображения, отображаемые на). (должен отражать изображения в коллекции).
[что-то похожее на AsyncBinding List.].

Аналогично тому, как элементы управления .net используют свойство DataSource.

// [EDITED] нужен список привязок.

    BindingList<Image> _images = GetImages("folder_path");   
    ImageControl ctrl = new ImageControl();   
    ctrl.DataSource = _images; //something similar

Как я могу добиться того же?

EDIT2:
По сути, я хочу отображать изображения в виде списка. Что-то похожее на то, как это отображает Picasa.

пример изображения http://www.aiostudents.com/images/articles/011_picasa3.jpg

Спасибо всем

Ответы [ 2 ]

1 голос
/ 12 июля 2010

Как уже упоминалось в STW, вам нужно BindingList<T>, чтобы изменения в списке распространялись на BindingSource.

Следующим шагом будет уведомление вашего UserControl об изменениях в BindingSource.Чтобы решить эту проблему, добавьте этот код в качестве отправной точки в свой UserControl.cs:

private BindingSource _DataSource;
[TypeConverter("System.Windows.Forms.Design.DataSourceConverter, System.Design")]
[Editor("System.Windows.Forms.Design.DataSourceListEditor, System.Design", typeof(UITypeEditor))]
[AttributeProvider(typeof(IListSource))]
public object DataSource
{
    get
    {
        return _DataSource;
    }
    set
    {
        //Detach from old DataSource
        if (_DataSource != null)
        {
            _DataSource.ListChanged -= _DataSource_ListChanged;
        }

        _DataSource = value as BindingSource;

        //Attach to new one
        if (_DataSource != null)
        {
            _DataSource.ListChanged += _DataSource_ListChanged;

            //ToDo: look for other (maybe usable) BindingSource events
            //http://msdn.microsoft.com/en-us/library/system.windows.forms.bindingsource_events.aspx
        }
    }
}

void _DataSource_ListChanged(object sender, ListChangedEventArgs e)
{
    //ToDo: Reacht on specific list change
    switch (e.ListChangedType)
    {
        case ListChangedType.ItemAdded:
            break;
        case ListChangedType.ItemChanged:
            break;
        case ListChangedType.ItemDeleted:
            break;
        case ListChangedType.ItemMoved:
            break;
        case ListChangedType.PropertyDescriptorAdded:
            break;
        case ListChangedType.PropertyDescriptorChanged:
            break;
        case ListChangedType.PropertyDescriptorDeleted:
            break;
        case ListChangedType.Reset:
            break;
        default:
            break;
    }
}

. При этом вам сообщат, если кто-то внесет изменения в сам BindingSource (обменяет весь список на новый) илив списке элементов, прикрепленных к BindingSource.

Также вы должны действительно хорошо протестировать его, потому что некоторые элементы управления имеют немного странное использование списков (например, вместо изменения некоторых элементов в списке, очистите его и заполните егос нуля).

Может быть это прохождение от Microsoft тоже может помочь.Я не читал, но выглядит многообещающе.

1 голос
/ 12 июля 2010

Вы хотите использовать BindingList вместо List или Collection. Основное отличие состоит в том, что BindingList поддерживает INotifyPropertyChanged, который требуется для выполнения двусторонней привязки данных. Без этого интерфейса вы можете изначально привязаться к списку, но изменения в списке не будут отражены в пользовательском интерфейсе.

...