Что делать, чтобы изменение TextBox Left обновляло значение X связанного класса? - PullRequest
1 голос
/ 27 августа 2009

У меня есть TextBox, и я изменяю его значение слева. И этот TextBox связан с классом, который имеет свойство X. Теперь, когда я изменяю значение Left моего TextBox, я хотел бы обновить X моего класса. Что я должен сделать, чтобы принудительно обновить свойство класса с привязкой к данным?

1 Ответ

3 голосов
/ 27 августа 2009

Из-за того, как работает привязка данных, этот тип двусторонней привязки будет работать только в том случае, если элемент управления объявляет об изменениях; обычно через событие *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);
            }
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...