Как подключить Data Binding, Linq, DataGridView способом MVC? - PullRequest
0 голосов
/ 27 сентября 2011

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

1 Ответ

0 голосов
/ 27 сентября 2011

Проверьте, имеет ли значение ObservableCollection http://msdn.microsoft.com/en-us/library/ms668604.aspx или BindingList http://msdn.microsoft.com/en-us/library/ms132679.aspx.

кстати, вы сделали опечатку (забыли 'r'):

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