如何将控件的属性绑定到另一个控件的属性

本文关键字:属性 控件 另一个 绑定 | 更新日期: 2023-09-27 18:06:27

我的窗体上有两个控件(control1和control2),它们彼此相邻。control1的宽度是可变的。

我可以将control2的Left属性绑定到control1的width属性吗?

我写了下面的代码,但它没有工作:

control2.DataBindings.Add(new Binding("Left", control1, "Width"));

如何将控件的属性绑定到另一个控件的属性

control2.DataBindings.Add(new Binding("Left", control1, "Width"));//Your code

你的代码不工作,因为当改变Width属性时没有更改通知,但Size有。

你可以绑定到Size,但问题是你需要一个int,但大小属性的类型是Size,所以你需要转换它也使用Format事件,像这样。

var binding = new Binding("Left", control1, "Size", true,DataSourceUpdateMode.Never);
binding.Format += (sender, args) =>
{
    if (args.DesiredType == typeof (int))
    {
        Size size = (Size) args.Value;
        args.Value = size.Width;
    }
};
control2.DataBindings.Add(binding);

另一种方法是在源代码控制中实现INotifyPropertyChanged。应该可以了

try this:

control2.DataBindings.Add(new Binding("Left", control1, "Width"));

你可以这么做。这里是一个代码片段,我将trackbar值绑定到按钮的宽度

button1.DataBindings.Add(new Binding("width", trackBar1, "value"));

我也尝试了文本框,它也工作。

button1.DataBindings.Add(new Binding("left", textBox1, "Text"));

需要实现INotifyPropertyChanged接口

我再往下看,它有三个选项

public enum DataSourceUpdateMode
{
  OnValidation,
  OnPropertyChanged,
  Never
}

默认是OnValidation,但是Width不会引起Validation和PropertyChanged

用法示例:

   panel1.DataBindings.Add(new Binding("Width", panel2, "Width", false,  DataSourceUpdateMode.OnPropertyChanged));

我认为处理这个问题最简单的方法是通过EventHandlers:

public Form1()
    {
        InitializeComponent();
        panel2.SizeChanged +=panel2_SizeChanged;
    }
    private void button1_Click(object sender, EventArgs e)
    {
        panel2.Size = new Size(panel2.Size.Width * 2, panel2.Size.Height * 2);
    }
    void panel2_SizeChanged(object sender, EventArgs e)
    {
        panel1.Size = panel2.Size;
    }