Расширяете ли решение для простой привязки к свойству Text для нескольких элементов управления для обработки привязки к любому типу?
Мой вопрос : как выйти за рамки написания пользовательской реализации метода привязки данных к нескольким элементам управления (элементам управления без встроенных свойств DataSource),для каждого возможного типа данных, к простым свойствам ...как описано и продемонстрировано в следующем коде ... чтобы получить более мощное решение, которое не будет зависеть от того, является ли привязка строкой, int или другими типами.
Я предполагаю: это потребует рефлексии; но я застрял в этой точке. Я ищу стратегический совет о том, какое «направление» двигаться дальше, подсказки, подсказки, а не полный ответ кода, но, конечно, я ценю все ответы, и я обязательно изучу код, если вы отправите код в ответ! Статья Марка Клифтона 2005 года о CodeProjectПростая привязка данных: похоже, демонстрирует подход, основанный на рефлексии: но, честно говоря, я не очень понимаю его код, и, с точки зрения .NET, 2005 являетсядолго давно.
Фон: частично в ответ на различные вопросы и ответы SO, такие как:Обновление Usercontrol на трех формах: Я разработал успешную технику для привязки данных свойств текста различных элементов управления одновременно к одному источнику, определенному в классе Public; также был в состоянии «абстрагировать» некоторые детали процесса привязки, используя статический класс, который определяет один метод расширения и два открытых метода.
Я проверил, что TextBoxes в элементах управления в «MainForm», TextBoxes в UserControl в MainForm и TextBox во второй форме, открытые «независимо» (т. Е. Form2.Parent == null), все обновляются правильно (т. Е. Два действует связывание) из открытого класса «Эквивалент источника данных». Измени одно: измени все.
Код: экземпляр этого класса предоставит целевое свойство (theText) для привязки данных:
public class TextDataBinder
{
public event PropertyChangedEventHandler PropertyChanged;
private string _theText;
public string theText
{
get { return _theText; }
// note : if 'setter is declared 'internal : blocks
// auto-updating when run-time user modifies consumers
// but will still allow update via code
set
{
_theText = value;
OnPropertyChanged(new PropertyChangedEventArgs("theText"));
}
}
protected void OnPropertyChanged(PropertyChangedEventArgs e)
{
if (this.PropertyChanged != null)
{
this.PropertyChanged(this, e);
}
}
}
Код: этот статический класс позволяет скрыть некоторую сложность процесса привязки и обеспечивает легкую привязку к нескольким элементам управления:
public static class TextBindingExtender
{
public static TextDataBinder CurrentDataSource;
public static void SetCurrentDataSource(TextDataBinder newCurrentDataSource)
{
CurrentDataSource = newCurrentDataSource;
}
// extension method for Control
public static void AddTextBinding(this Control theControl, string controlPropertyName, string targetPropertyName)
{
theControl.DataBindings.Add(controlPropertyName, CurrentDataSource, targetPropertyName, false, DataSourceUpdateMode.OnPropertyChanged);
}
// bind to all Controls in a List<Control>
public static void AddTextBindings(List<Control> theControls, string controlPropertyName, string targetPropertyName)
{
foreach (Control theControl in theControls)
{
theControl.AddTextBinding(controlPropertyName, targetPropertyName);
}
}
}
Как используются вышеуказанные классы (в событии загрузки формы):
// create a new TextDataBinder
TextBindingExtender.CurrentDataSource = new TextDataBinder();
// bind to multiple textboxes, label, on a UserControl, on another Form, etc.
TextBindingExtender.AddTextBindings(new List<Control> { textBox1, textBox2, userControl11.tb, label1, instanceOfForm2.tb }, "Text", "theText");
// test assigning some initial text to the bound property
TextBindingExtender.CurrentDataSource.theText = "some initial text";