实现ibindable组件的问题

本文关键字:问题 组件 ibindable 实现 | 更新日期: 2023-09-27 18:11:39

我需要绑定一个属性到ToolStripMenuItem。我搜索了一下,发现这是不可能的,最好的解决方案似乎是创建一个BindableToolStripMenuItem类,并实现它自己。因此,我从互联网上获取了一些相当完善的代码:

public class BindableToolStripMenuItem : ToolStripMenuItem,IBindableComponent
{
    private BindingContext bindingContext;
    private ControlBindingsCollection dataBindings;
    [Browsable(false)]
    public BindingContext BindingContext
    {
        get
        {
            if (bindingContext == null)
                bindingContext = new BindingContext();
            return bindingContext;
        }
        set
        {
            bindingContext = value;
        }
    }
    [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
    public ControlBindingsCollection DataBindings
    {
        get
        {
            if (dataBindings == null)
                dataBindings = new ControlBindingsCollection(this);
            return dataBindings;
        }
    }
}

现在我需要绑定它,对吧?我用toolStripMenu设置了一个表单,并添加了一个属性来绑定:没有运气。我可以检查它,但是这些更改似乎没有过滤到绑定中。

public partial class Form1 : Form
{
    private Boolean _BindingChecked;
    public Boolean BindingChecked {
        get { return _BindingChecked;  }
        set { _BindingChecked = value; Console.WriteLine(": " + _BindingChecked); }
    }
    public Form1()
    {
        InitializeComponent();
        BindableToolStripMenuItem btsmi = new BindableToolStripMenuItem();
        btsmi.Text = "Checkable";
        btsmi.CheckOnClick = true;
        btsmi.DataBindings.Add(new Binding("Checked",this,"BindingChecked"));
        itemsToolStripMenuItem.DropDownItems.Add(btsmi);
    }
}

它确实做了一些绑定!如果我更改"Binding Checked"或"Checked"字符串,它会抛出相应的错误,例如:

An unhandled exception of type 'System.ArgumentException' occurred in System.Windows.Forms.dll
Additional information: Cannot bind to the property or column BindingChecked2 on the DataSource.

它只是任何改变(我测试它实现InotifyChanged走另一种方式)不被应用到绑定属性。

你知道我哪里做错了吗?我已经削减了这么多的东西,它只是这两个类,我已经尝试从头开始与BdindableToolStripMenuItem,并看了相当多的其他人的实现(几乎都是相同的),仍然不能让它工作。

谢谢

实现ibindable组件的问题

你可能想将绑定的DataSourceUpdateMode设置为OnPropertyChanged,默认值是OnValidation,但由于菜单项没有正常的焦点行为,我可以想象默认值不起作用。这允许菜单项上的更新传播到BindingChecked属性

如果你想反过来,通过代码更新BindingChecked属性来传播到菜单项,你必须在表单上实现INotifyPropertyChanged,并在你从代码中改变属性时引发事件(例如在属性集访问器中)