Чтобы создать настраиваемый элемент управления, поддерживающий простой привязку данных, я выполнил инструкции, указанные Microsoft here, и вскоре после того, как я обнаружил, что они неполны. Реализация атрибута DefaultBindingProperty
недостаточно, и вам кажется, что вам нужно иметь контроль либо (i), реализуя INotifyPropertyChanged
, либо выставляя событие с именем <propertyname>Changed
, как описано here.Каковы ВСЕ требования для реализации простой привязки данных в UserControl?
Тем не менее, мой код (на самом деле очень упрощенная версия) здесь ниже не работает, и я борюсь за это, поскольку почти 1 день сейчас. Мой контроль:
[DefaultBindingProperty("Value")]
public partial class MyUserControl : UserControl
{
NumericUpDown upDown;
public MyUserControl()
{
InitializeComponent();
upDown = new NumericUpDown() { Minimum = 0, Maximum = 100, Dock = DockStyle.Fill };
Controls.Add(upDown);
upDown.ValueChanged += control_ValueChanged;
}
[Bindable(true)]
public double Value
{
get { return (double)upDown.Value; }
set { upDown.Value = (decimal)value; }
}
private void control_ValueChanged(object sender, EventArgs e)
{
if (ValueChanged != null)
ValueChanged(this, e);
}
public event EventHandler<EventArgs> ValueChanged;
}
и мой тест форма:
public partial class Form1 : Form
{
MyUserControl myUserControl;
BindingSource source;
MyClass myClass;
public Form1()
{
InitializeComponent();
source = new BindingSource();
myClass = new MyClass() { Amount = 30 };
source.DataSource = new[] { myClass };
myUserControl = new MyUserControl();
Controls.Add(myUserControl);
myUserControl.DataBindings.Add("Value", source, "Amount", false, DataSourceUpdateMode.OnPropertyChanged);
}
}
public class MyClass
{
int amount;
public int Amount
{
get { return amount; }
set
{
amount = value;
MessageBox.Show("New amount: " + amount);
}
}
}
MessageBox в конце кода не вызывается при изменении значения в NumericUpDown
. Есть ли еще какая-то информация, которую мне не хватает? Что я здесь делаю неправильно?
Да, это было большое спасибо! Я понимаю, что привязка данных ожидала «EventHandler» вместо «EventHandler», но я не могу поверить, что в Microsoft они не добавили поддержки для последнего, когда были введены общие данные! Хуже того, я не могу найти эту документацию в любом месте, и невероятно потерять более одного дня работы за небольшой недостаток, как это! –