Добавить свойство источника данных в пользовательский элемент управления WinForms - PullRequest
4 голосов
/ 29 октября 2008

Я хочу добавить сложную привязку данных в свой пользовательский элемент управления winforms, чтобы я мог сделать следующее:

myControl.DisplayMember = "Name";
myControl.ValueMember = "Name";
myControl.DataSource = new List<someObject>();

Кто-нибудь знает, какие интерфейсы и т. Д. Должны быть реализованы для достижения этой цели?

Я посмотрел на это, и все, что я нашел, это IBindableComponent, но, похоже, это касается простого связывания, а не сложного связывания.

Ответы [ 2 ]

3 голосов
/ 14 декабря 2018

Примените один из следующих атрибутов к своему пользовательскому элементу управления, в зависимости от того, какой тип привязки данных вам нужен:

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

Например, реализации, посмотрите исходный код .NET Framework :

  • ComplexBindindPropertiesAttribute реализация в DataGridView
  • LookupBindingPropertiesAttribute реализация в ListControl

Но эти реализации выглядят для меня очень сложными, поэтому может быть проще встроить существующий элемент управления (например, DataGridView, ListBox или ComboBox) в собственный настраиваемый элемент управления, чтобы использовать преимущества существующих данных. обязательная реализация, а не написание собственной. (Вы можете сделать встроенный элемент управления невидимым, если это необходимо.) Такой подход продемонстрировал Microsoft в следующих руководствах:

В этих руководствах они создают источник данных для привязки пользовательского элемента управления к внешней базе данных, но похоже, что вы просто пытаетесь привязать свой пользовательский элемент управления к внутренней коллекции, такой как List<T>. В этом случае адаптированный код, приведенный ниже, может работать для вас.


В проекте Windows Forms в Visual Studio добавьте новый UserControl.

Для привязки данных complex примените ComplexBindingPropertiesAttribute к пользовательскому элементу управления. Добавьте DataGridView элемент управления к нему. Добавьте свойства DataSource и DataMember и подключите их к собственным свойствам DataGridView.

// ComplexBindingControl.cs
// Adapted from https://docs.microsoft.com/visualstudio/data-tools/create-a-windows-forms-user-control-that-supports-complex-data-binding

using System.ComponentModel;
using System.Windows.Forms;

namespace BindingDemo
{
    [ComplexBindingProperties("DataSource", "DataMember")]
    public partial class ComplexBindingControl : UserControl
    {
        public ComplexBindingControl()
        {
            InitializeComponent();
        }

        // Use a DataGridView for its complex data binding implementation.

        public object DataSource
        {
            get => dataGridView1.DataSource;
            set => dataGridView1.DataSource = value;
        }

        public string DataMember
        {
            get => dataGridView1.DataMember;
            set => dataGridView1.DataMember = value;
        }
    }
}

Для привязки данных lookup примените LookupBindingPropertiesAttribute к пользовательскому элементу управления. Добавьте элемент управления ListBox или ComboBox. Добавьте свойства DataSource, DisplayMember, ValueMember и LookupMember и подключите их к собственным свойствам ListBox или ComboBox.

// LookupBindingControl.cs
// Adapted from https://docs.microsoft.com/visualstudio/data-tools/create-a-windows-forms-user-control-that-supports-lookup-data-binding

using System.ComponentModel;
using System.Windows.Forms;

namespace BindingDemo
{
    [LookupBindingProperties("DataSource", "DisplayMember", "ValueMember", "LookupMember")]
    public partial class LookupBindingControl : UserControl
    {
        public LookupBindingControl()
        {
            InitializeComponent();
        }

        // Use a ListBox or ComboBox for its lookup data binding implementation.

        public object DataSource
        {
            get => listBox1.DataSource;
            set => listBox1.DataSource = value;
        }

        public string DisplayMember
        {
            get => listBox1.DisplayMember;
            set => listBox1.DisplayMember = value;
        }

        public string ValueMember
        {
            get => listBox1.ValueMember;
            set => listBox1.ValueMember = value;
        }

        public string LookupMember
        {
            get => listBox1.SelectedValue.ToString();
            set => listBox1.SelectedValue = value;
        }
    }
}

Чтобы проверить это, соберите проект в Visual Studio, затем добавьте экземпляр пользовательского элемента управления в Form. Создайте несколько примеров данных и привяжите их к пользовательскому элементу управления, используя соответствующие свойства.

// Form1.cs

using System.Collections.Generic;
using System.Windows.Forms;

namespace BindingDemo
{
    public partial class Form1 : Form
    {
        private readonly List<SomeObject> data;

        public Form1()
        {
            InitializeComponent();

            // Prepare some sample data.
            data = new List<SomeObject>
            {
                new SomeObject("Alice"),
                new SomeObject("Bob"),
                new SomeObject("Carol"),
            };

            // Bind the data to your custom control...

            // ...for "complex" data binding:
            complexBindingControl1.DataSource = data;

            // ...for "lookup" data binding:
            lookupBindingControl1.DataSource = data;
            lookupBindingControl1.DisplayMember = "Name";
            lookupBindingControl1.ValueMember = "Name";
        }
    }

    internal class SomeObject
    {
        public SomeObject(string name)
        {
            Name = name;
        }

        public string Name { get; set; }
    }
}
0 голосов
/ 06 мая 2014

Ваш класс должен наследовать класс DataBoundControl вместо UserControl.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...