Примените один из следующих атрибутов к своему пользовательскому элементу управления, в зависимости от того, какой тип привязки данных вам нужен:
(В вопросе конкретно упоминается сложная привязка данных, но данный пример кода выглядит как 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; }
}
}