Я бы хотел максимально разделить логику представления и элементы управления в стиле MVC:
class MyModel : INotifyPropertyChanged {
private IEnumerable<Domain> _domains;
public IEnumerable<Domain> Domains {
get { return _domains; }
set { _domains = value; SendPropertyChanged("Domains");
}
}
class MyControl
{
// m_Grid's hooked up to m_BindingSource
private DataGridView m_Grid;
private BindingSource m_BindingSouce;
public void SetModel( MyModel model )
{
m_BindingSource.DataSource = model.Domains;
}
}
class Controller
{
private MyModel _model;
private void UpdateDomains()
{
// predicate is built on user inputs
_model.Domains = db.GetDomains( predicate );
}
}
// extra code to create Controller, MyModel, and MyControl.
При изменении MyModel.Domains вызывается событие, информирующее MyControl о том, что его m_BindingSource.DataSource изменен.Однако сетка не обновляется с новыми значениями.Чтобы решить эту проблему, MyControl изменено на:
class MyControl
{
public void SetModel( MyModel model )
{
m_BindingSource.DataSource = model.Domains;
model.Domains.PropertyChanged += OnDataChanged;
}
private void OnDataChanged(object sender, PropertyChangedEventArgs e)
{
BindingSource.DataSource = _model.Data.Users;
}
}
Может кто-нибудь объяснить, зачем это нужно?Одним из основных преимуществ DataBinding является облегчение программистам управления событиями PropertyChanged.По иронии судьбы, BindingSouce способен обнаруживать изменения в MyModel.Domains.Я экспериментировал с обновлением DataSource внутри обработчика m_BindingSource.DataSourceChanged.После изменения сетка перестает обновляться.