[英]Am I using IEnumerable correctly?
我对以下代码感到头疼。 似乎很简单,但是我不明白为什么会出错。
这个想法很简单,我只是循环将DataGirdView的引用添加到ViewModel的属性中。 就这样。
但是,在修改ViewModel中的值之后, IEnumerable<ICompanyViewModel> vms
不会像没有发生那样反映它。 我做错了什么? 请帮忙。
public void UpdateCompany(IEnumerable<ICompanyViewModel> vms) {
CompanyBindingSource.DataSource = new BindingListView<CompanyViewModel>(vms.ToList());
var lst = new List<DataGridViewRow>();
foreach (DataGridViewRow dgvr in DataGridView1.Rows) lst.Add(dgvr);
foreach (var vm1 in vms) {
foreach (var dgvr in lst) {
var ov = (ObjectView<CompanyViewModel>)dgvr.DataBoundItem;
var vm2 = (ExhibitorViewModel)ov.Object;
if (vm1.ID == vm2.ID) {
vm1.DataGridViewRow = dgvr;
break;
}
}
if (vm1.DataGridViewRow != null) lst.Remove(vm1.DataGridViewRow);
} // I can see DataGridViewRows being matched with vm1.
} // Then, I expand IEnumerable 'vms' and check the value again. All
// the ViewModels lost their references to the matching DataGridViewRows.
// In every ViewModel.DataGridViewRow = null; WHY IS THIS HAPPENING??
//.... here is the background code of my model
public class CompanyViewModel : BaseViewModel, ICompanyViewModel {
public DataGridViewRow DataGridViewRow { get; set; }
public ICompany Company { get; set; }
public long ID {
get { return Company.ID; }
}
public string Name {
get { return Company.Name; }
set { Company.Name = value; }
}
}
public interface ICompanyViewModel : IViewModel {
DataGridViewRow DataGridViewRow { get; set; }
public ICompany Company { get; set; }
long ID { get; }
string Name { get; set; }
}
public interface IViewModel { }
public abstract class BaseViewModel : IViewModel { }
好吧,如果您使用的是IEnumerable<T>
,则必须手动(明确地)对绑定机制(无论是什么)说,更新!
如果您不喜欢这个主意,可以考虑改用ObservableColelction 。 在这种情况下, .net framework
本身会跟踪该集合中发生的Add
和Remove
事件,并更新它绑定到的绑定。
问题的根源:IEnumerable的多重枚举
我使用IEnumerable错误。 根据Resharper的说法,我应该真正调用.ToList();。 一旦我得到IEnumerable <ICompanyViewModel> vms的列表。
否则,每次我调用foreach时...我实际上是在再次调用数据库! 噢,很重要的一点是不要出错,幸运的是,我发现了。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.