像在WPF中一样在winform中绑定

时间:2011-02-17 17:13:45

标签: c# wpf winforms

我想将winform的表单的Width属性绑定到标签上的Text,这样标签的文本会在我每次鼠标移动时更新。目前,我只在单击某个表单上的某个元素但未进行连续更新时才更新(如果您在Resize处理程序中更改了文本)。怎么做这件事?

3 个答案:

答案 0 :(得分:3)

您可以通过执行以下操作绑定到Width属性:

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

问题在于表单没有通知框架属性已更改。你最简单的最好的赌注可能只是做肉和土豆的方式:

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

编辑:好的,如果你真的想要使用数据绑定,这是一种有效的方法(但就像绕过你的脑袋一样):

将对象数据源添加到表单并将DataSource设置为“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 :(得分:1)

Resize事件是要处理的正确事件。我不确定您正在寻找什么持续更新,但如果表单更改大小,则调整事件大小会触发。我相信这还包括最小化/最大化/恢复的大小更改。这应该涵盖对表单大小的所有更改。

private void OnFormResize(object sender, EventArgs args)
{
      Form frm = (Form) sender;
      txtWidth.Text = frm.Size.Width.ToString();
}

答案 2 :(得分:0)

你是对的,绑定到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();
        }
    }
}