Можно ли привязать динамические свойства к свойствам элемента управления WinForms? - PullRequest
4 голосов
/ 19 августа 2010

Я бы хотел привязать динамические свойства к свойствам элемента управления WinForms.

В следующем примере я привязываю свойство IsAlive потока к параметру Enabled кнопки.

using System;
using System.Windows.Forms;
using System.Threading;

namespace ThreadTest
{
  public partial class Form1 : Form
  {
    Thread thread;

    public Form1()
    {
      InitializeComponent();

      thread = new Thread(() =>
        {
          while (true)
            Thread.Sleep(125);
        }
      );

      button2.DataBindings.Add("Enabled", thread, "IsAlive");
    }

    private void buttonStart_Click(object sender, EventArgs e)
    {
      thread.Start();
    }

    private void buttonStop_Click(object sender, EventArgs e)
    {
      // ...
    }
  }
}

Это работает только при запуске. Кнопка «Стоп» отключена, потому что поток не жив. Когда я нажимаю кнопку «Пуск», я ожидаю, что кнопка «Стоп» станет активной. Но это не так.

Я что-то упустил или это просто невозможно?

Ответы [ 2 ]

3 голосов
/ 19 августа 2010

Поток не реализует INotifyPropertyChanged , а также не имеет события «IsAliveChanged», поэтому привязка данных не может распознать, что IsAlive изменился.

Эта запись в блоге содержит несколько советов и приемов, чтобы заставить привязку данных работать в WinForms.Основным требованием является то, что классы, к которым вы привязываете, должны разрабатываться с учетом привязки данных, если вы хотите поддерживать динамические обновления из источника данных в элемент управления.

1 голос
/ 19 августа 2010

Привязка данных в WinForms довольно нарушена, поскольку автоматически они работают только одним способом (при изменении пользовательского интерфейса объект обновляется).Если вы являетесь владельцем объекта, используемого для привязки, вы должны реализовать на нем интерфейс INotifyPropertyChanged .В вашем случае вы должны вручную сбросить привязки, чтобы заставить его работать (таким образом, привязка на самом деле ничего вам не дает)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...