我有一个DataGrid绑定到IEditableObject的集合.
现在当我在一个单元格中单击两次时,它将被打开以进行编辑.
有趣的是:BeginEdit将被调用两次.有时对于相同的EditableObject,但有时对于两个不同的对象(特别是当我使用PgDn直到我到达DataGrid的末尾)时,将首先调用正确的一个,然后从集合中调用其他一些项目,之前从未进行过聚焦.
EndEdit也被调用两次,但始终用于所选项,而不是错误的项.
这是一个已知的问题吗?任何解决方法只能获得(右侧)一个通知.
你能想到一个IEditableObject在基于MVVM的WPF应用程序中仍然有用的场景吗?如果是这样,你有一个例子来证明这一点.
背景:
我正在编写一个WPF应用程序,严格遵循MVVM模式.我有一个BaseRepository类作为连接到不同数据库的通用接口(EF不是一个选项),一切正常; 这只是一个技术问题.
我使用一个名为NotifyingCollection的包装ObservableCollection来订阅IEditableObject的ItemEndEdit事件(我的ViewModelBase实体包装器实现了INotifyPropertyChanged和IEditableObject成员).
当在我的WPF DataGrid中编辑项目时调用ReadAll方法时,提供的代码示例将抛出" 'EditItem'不允许此视图 "异常.但是,如果我用注释掉的部分替换方法中的线,它就可以完美地工作!
题:
换句话说,它看起来像中继Linq.Enumerable.Where扩展方法而不是返回集合的IEnumerable版本从自定义集合中删除功能; 如果它们都是IEnumerable,为什么会这样呢?
代码示例:
namespace MyCompany.Common.Abstracts
{
using System;
using System.Collections.Generic;
using System.Collections.Specialized;
using System.ComponentModel;
using System.Data.Common;
using System.Diagnostics;
using System.Linq;
using System.Linq.Expressions;
using MyCompany.Common.Extensions;
using MyCompany.Common.Utilities;
public abstract class BaseRepository<TEntity> : IDisposable where TEntity : ViewModelBase
{
protected BaseRepository()
{
this.EntitySet = new NotifyingCollection<TEntity>();
this.EntitySet.ItemEndEdit += new ViewModelBase.ItemEndEditEventHandler(ItemEndEdit);
this.EntitySet.CollectionChanged += new NotifyCollectionChangedEventHandler(CollectionChanged);
}
protected abstract NotifyingCollection<TEntity> EntitySet { get; set; }
protected virtual void PropertyChanged(object sender, PropertyChangedEventArgs e)
{ …Run Code Online (Sandbox Code Playgroud)