Связывание в winform как в WPF - PullRequest
3 голосов
/ 17 февраля 2011

Я хочу связать свойство Width формы winform с Text на ярлыке, чтобы текст ярлыка обновлялся при каждом движении мыши, которое я делал. В настоящее время я выполняю обновление только при нажатии на какой-либо элемент в форме, но не при постоянном обновлении (например, если вы меняете текст в обработчике изменения размера). Как это сделать?

Ответы [ 3 ]

3 голосов
/ 17 февраля 2011

Привязать к свойству Width можно следующим образом:

label1.DataBindings.Add(new Binding("Text", this, "Width"));

Проблема в том, что форма не уведомляет платформу об изменении свойства.Ваша самая простая лучшая ставка, скорее всего, состоит в том, чтобы сделать это по-мясному:

protected override void OnResize(EventArgs e)
{
    base.OnResize(e);
    label1.Text = this.Width.ToString();
}

РЕДАКТИРОВАТЬ: Хорошо, если вы действительно хотите использовать привязку данных, вот способ, который работает(но это все равно что тянуть голову за голову, чтобы почесать ухо):

Добавьте источник данных объекта в свою форму и установите для источника данных тип "System.Windows.Forms.Form".

Затем добавьте немного кода:

public Form2()
{
   InitializeComponent();

   this.formBindingSource.DataSource = this;

   Binding binding = new Binding("Text", this.formBindingSource, "Size", true);

   binding.Format += new ConvertEventHandler(binding_Format);

   label1.DataBindings.Add(binding);
}

void binding_Format(object sender, ConvertEventArgs e)
{
    Size size = (Size)e.Value;
    e.Value = size.Width.ToString();
}

Итак, как я уже сказал, это полное излишество, но оно работает.

1 голос
/ 17 февраля 2011

Событие Resize является правильным событием для обработки. Я не уверен, какое непрерывное обновление вы ищете, но если форма меняет размер, запускается событие Resize. Я считаю, что это также включает в себя изменения размера для минимизации / максимизации / восстановления. Это должно охватывать все изменения размера формы.

private void OnFormResize(object sender, EventArgs args)
{
      Form frm = (Form) sender;
      txtWidth.Text = frm.Size.Width.ToString();
}
0 голосов
/ 17 февраля 2011

Вы правы, привязка к свойству Width не будет работать правильно, потому что в Form нет события WidthChanged.

Вы можете привязать свойство Size и использовать форматирование для форматирования

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();

        var binding = new Binding("Text", this, "Size", false, DataSourceUpdateMode.OnPropertyChanged);
        binding.Format += new ConvertEventHandler(binding_Format);

        label1.DataBindings.Add(binding);
    }

    void binding_Format(object sender, ConvertEventArgs e)
    {
        if (e.Value is Size)
        {
            e.Value = ((Size)e.Value).Width.ToString();
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...