0

次のコードで頭痛がします。非常に簡単に思えますが、なぜうまくいかないのかわかりません。

アイデアは単純です。私は、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 { }
4

2 に答える 2

0

問題の根本:IEnumerableの複数の列挙

IEnumerableを誤って使用しています。Resharperによると、私は実際に.ToList();を呼び出す必要があります。IEnumerable<ICompanyViewModel>vmsのリストを取得するとすぐに。

それ以外の場合は、foreachを呼び出すたびに...データベースを効果的に再度呼び出しています。幸運なことに、これを間違えないことが非常に重要です。

于 2012-12-11T00:25:34.463 に答える
0

さて、あなたが使用しているなら、あなたはIEnumerable<T>手動で(明示的に)バインディングメカニズム(それが何であれ)に言う必要があります、更新してください!。

そのアイデアが気に入らない場合は、代わりにObservableColelctionの使用を検討してください。この場合、.net frameworkそれ自体がそのコレクションで発生したイベントを追跡AddRemove、バインドされたバインディングを更新します。

于 2012-12-10T08:36:20.843 に答える