【问题标题】:Problems Implementing IBindableComponent实现 IBindableComponent 的问题
【发布时间】:2014-07-04 12:40:45
【问题描述】:

我需要将属性绑定到 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,并查看了一些其他人的实现(几乎都是相同的),但仍然无法实现工作。

谢谢

【问题讨论】:

    标签: c# .net winforms data-binding


    【解决方案1】:

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

    如果您希望反向,通过代码对 BindingChecked 属性的更新传播到菜单项,您必须在表单上实现 INotifyPropertyChanged 并在您从代码更改属性时引发事件(例如,在属性集访问器中)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-09-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-22
      相关资源
      最近更新 更多