Привязка свойства Checkbox.Checked к свойству в DataSet - PullRequest
2 голосов
/ 18 мая 2011

Среда: 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 Ответ

2 голосов
/ 18 мая 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...