Из-за того, как работает привязка данных, этот тип двусторонней привязки будет работать только в том случае, если элемент управления объявляет об изменениях; обычно через событие *Changed
- т.е. LeftChanged
в этом случае. Поскольку такого события не существует, вы просто не можете, если не считать подклассы TextBox
, повторное объявление (new
) Left
и добавление LeftChanged
, которое подключает LocationChanged
.
Можете ли вы просто добавить событие в LocationChanged
и сделать это вручную? Или просто обновить объект вручную при указании местоположения / слева?
using System;
using System.Windows.Forms;
namespace WindowsFormsApplication1
{
class SuperTextBox : TextBox
{
protected override void OnLocationChanged(EventArgs e)
{
base.OnLocationChanged(e);
EventHandler handler = (EventHandler)Events[LeftChangedKey];
if (handler != null) handler(this, EventArgs.Empty);
}
public event EventHandler LeftChanged
{
add { Events.AddHandler(LeftChangedKey, value); }
remove { Events.RemoveHandler(LeftChangedKey, value); }
}
public new int Left
{
get { return base.Left; }
set { base.Left = value; }
}
private static readonly object LeftChangedKey = new object();
}
class Person {
private int value;
public int Value {
get {return value;}
set {
this.value = value;
EventHandler handler = ValueChanged;
if(handler!=null)
{
handler(this, EventArgs.Empty);
}
}
}
public event EventHandler ValueChanged;
}
static class Program
{
static void Main()
{
Button btn;
TextBox txt;
Person p = new Person { Value = 10 };
using (Form form = new Form {
DataBindings = {{ "Text", p, "Value"}},
Controls = {
(txt = new SuperTextBox {
DataBindings = {{ "Left", p, "Value", false,
DataSourceUpdateMode.OnPropertyChanged}}
}),
(btn = new Button {
Text = "bump",
Dock = DockStyle.Bottom
})
}
}) {
btn.Click += delegate { txt.Left += 5; };
Application.Run(form);
}
}
}
}