将Checkbox.Checked属性绑定到DataSet上的属性

时间:2011-05-17 21:19:13

标签: c# winforms data-binding

环境: Visual Studio 2010,.NET 4.0,WinForms

我有DataSet实施INotifyPropertyChanged,并在bool上创建了DataSet属性。我正在尝试将CheckBox.Checked属性绑定到该bool属性。当我尝试在设计器中执行此操作时,我会在DataSet中看到DataSet和表,但不会看到属性。我尝试手动执行此操作,但收到找不到该属性的错误。我所看到的唯一不同的是我正在做的是表单上的属性是正在实例化的DataSet的超类,但我甚至不知道这会对任何事情产生什么影响。下面是一段代码。

派生类定义

public class DerivedDataSetClass: SuperDataSetClass, INotifyPropertyChanged
{
  private bool _mainFile = false;
  public bool MainFile
  {
    get { return this._mainFile; }
    set { 
      this._mainFile = value;
      this.NotifyPropertyChanged("MainFile");
    }
  }
}

属性定义

private SuperDataSetClass _dataSet;
public DerivedDataSetClass DataSet
{
   get { return (DerivedDataSetClass)_dataSet;
}

CTOR

this._DataSet = new DerivedDataSetClass (this);

this.mainFileBindingSource = new BindingSource();
this.mainFileBindingSource.DataSource = typeof(DerivedDataSetClass);
this.mainFileBindingSource.DataMember = "MainFile";

var binding = new Binding("Checked", this.mainFileBindingSource, "MainFile");
this.chkMainFile.DataBindings.Add(binding);

思想?

1 个答案:

答案 0 :(得分:2)

问题直接来自您希望使用DerivedDataSetClass的方式。由于它是DataSet,所以任何绑定都将使用其默认的DataViewManager,其中“推送”绑定进一步绑定到Tables

当您绑定到DerivedDataSet MainFile媒体资源时,正在做的工作是尝试绑定到您名单中的MainFile表格数据集表。当然这会失败,除非你真的在数据集中有这样的表。出于同样的原因,您无法绑定到基础DataSet的任何其他属性 - 例如。 LocaleHasErrors - 它还会检查是否存在此类表格,而不是属性。

这个问题的解决方案是什么?您可以尝试实现不同的DataViewManager - 但是我无法在该主题上找到可靠的资源。

我建议为您的MainFile属性和关联的DerivedDataSetClass创建简单的包装类,如下所示:

public class DerivedDataSetWrapper : INotifyPropertyChanged
{
    private bool _mainFile;

    public DerivedDataSetWrapper(DerivedDataSetClass dataSet)
    {
        this.DataSet = dataSet;
    }

    // I assume no notification will be needed upon DataSet change;
    // hence auto-property here
    public DerivedDataSetClass DataSet { get; private set; }

    public bool MainFile
    {
        get { return this._mainFile; }
        set
        {
            this._mainFile = value;
            this.PropertyChanged(this, new PropertyChangedEventArgs("MainFile"));
        }
    }
}

现在,您可以绑定到数据集内部内容(表)以及包装器类上的MainFile

var wrapper = new DerivedDataSetWrapper(this._DataSet);
BindingSource source = new BindingSource { DataSource = wrapper };

// to bind to checkbox we essentially bind to Wrapper.MainFile
checkBox.DataBindings.Add("Checked", source, "MainFile", false, 
   DataSourceUpdateMode.OnPropertyChanged);

要绑定数据集中的表的数据,您需要绑定到DerivedDataSetWrapper DataSet属性,然后导航表名称和列。例如:

textBox.DataBindings.Add("Text", source, "DataSet.Items.Name");

...将绑定到原始Items中的表格Name和列_DataSet