Расширяете ли решение для простой привязки к свойству 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";

Ответы на вопрос(1)

Ваш ответ на вопрос