Как правильно связать два свойства элемента управления с двумя свойствами объекта - PullRequest
0 голосов
/ 26 августа 2009

У меня есть форма с TextBox:

        Form f = new Form();
        TextBox t = new TextBox ();
        t.Click += new EventHandler(t_Click);
        t.LostFocus += new EventHandler(t_LostFocus);

        Testus tt = new Testus();

        t.DataBindings.Add("Left", Testus , "X");
        t.DataBindings.Add("Text", Testus , "Test");

        f.Controls.Add(t);
        f.ShowDialog();

И класс Testus вот так:

class Testus
{
    public string Test
    {
        get
        {
            return _text;
        }
        set
        {
            Console.WriteLine("Acomplished: text change");
            _text = value;
        }
    }
    private string _text;

    public int X
    {
        get
        {
            return x;
        }
        set
        {
            Console.WriteLine("Acomplished: X changed");
            x = value;
        }
    }
    int x;

    public Testus()
    {

    }
}

Как видите, я привязываю свой TextBox к классу Testus. В частности, я привязываю TextBox.Left к Testus.X и TextBox.Text к Testus.Test. Я хотел бы заявить, что изменение значения Controls Left повлияет на значение Testus.X и наоборот. И то же самое для TextBox.Text против Testus.Test.

Я добавил обработчики для Click и LostFocus моего элемента управления TextBox следующим образом:

    static void t_LostFocus(object sender, EventArgs e)
    {
        Console.WriteLine("TextBox lost focus");
    }

    static void t_Click(object sender, EventArgs e)
    {
        Console.WriteLine("Moving to right...");
        ((Control)sender).Left = 100;
    }

И я делаю этот тест:

  1. запустить приложение
  2. ввод текста в TextBox
  3. Изменить фокус на другой элемент управления

И я получаю эти результаты в консоли:

TextBox lost focus

И это все! Testus.Test не меняет своего значения!?

Но когда я сделаю это:

  1. запустить приложение
  2. нажмите на текстовое поле (изменить левое значение)

Я получаю такие результаты:

Moving to right...
Acomplished: X changed

Кажется, что Binding Left to X работает. И текста для проверки нет. И когда я поменяю местами привязки на эту:

    t.DataBindings.Add("Text", Testus , "Test");
    t.DataBindings.Add("Left", Testus , "X");

Чем работает Привязка к тексту, а привязка к X не работает. Итак, в заключение: только первая DataBinding работает.

Итак, мой вопрос: как связать два свойства TextBox (Left, Text) с двумя свойствами моего объекта (Testus) (X, Test), чтобы он работал хорошо?

1 Ответ

0 голосов
/ 26 августа 2009

Я всегда так делал.

Binding b = new Binding("Test");  
b.Source = tt;  
t.SetBinding(TextBox.TextProperty, b);
...