环境: 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);
思想?
答案 0 :(得分:2)
问题直接来自您希望使用DerivedDataSetClass
的方式。由于它是DataSet
,所以任何绑定都将使用其默认的DataViewManager
,其中“推送”绑定进一步绑定到Tables
。
当您绑定到DerivedDataSet
MainFile
媒体资源时,正在做的工作是尝试绑定到您名单中的MainFile
表格数据集表。当然这会失败,除非你真的在数据集中有这样的表。出于同样的原因,您无法绑定到基础DataSet
的任何其他属性 - 例如。 Locale
或HasErrors
- 它还会检查是否存在此类表格,而不是属性。
这个问题的解决方案是什么?您可以尝试实现不同的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
。