【发布时间】:2011-09-27 19:31:19
【问题描述】:
我想以 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 上的更改。我尝试在 m_BindingSource.DataSourceChanged 的处理程序中更新 DataSource。更改后,网格停止更新。
【问题讨论】:
-
我觉得model、view、presenter才是你真正想要的。
标签: c# .net winforms linq datagridview