Проблема напрямую связана с тем, как вы хотите использовать 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
.