【问题标题】:How can I add Remove method to ObservableCollection?如何将 Remove 方法添加到 ObservableCollection?
【发布时间】:2015-03-12 13:55:38
【问题描述】:

我有一个 raddataform 控件,它使用 ObservableCollection 作为输入源并自动生成字段。我在 person 类本身中实现了 Insert 和 Edit Logic,它通过 BeginEdit 和 EndEdit 方法实现了 IEditableObject 和 INotifyPropertyChanged。但是 public void Delete() 方法在那里不起作用。我还了解到 ObservableCollection 具有 CollectionChanged 事件,该事件具有 NotifyChangedCollectionAction.Remove 。那么如何在 ObservableCollection 上实现删除(删除)逻辑,以便它可以使用 linq 删除相应的字段?
这是代码:

 public class EmployeeDataContext
{
    private ICollectionView employees = null;
    public ICollectionView Employees
    {
        get
        {
            if (this.employees == null)
            {
                ObservableCollection<Person> newEmployees = new ObservableCollection<Person>();
                DataClassesDataContext db = new DataClassesDataContext();

                var query = from c in db.EPersons
                            select c;
                foreach (var q in query)
                {
                    newEmployees.Add(new Person((DateTime)q.EStartingDate, q.EFirstName,q.ELastName, (Person.OccupationPositions) q.EOccupation,q.EPhoneNumber, (int)q.ESalary));
                }                
                //newEmployees.CollectionChanged += (sender, args) =>
                //    {
                //        if (args.Action == NotifyCollectionChangedAction.Remove) 
                //    }
            return this.employees;

        } 
    }
}

【问题讨论】:

  • 顺便说一句,EmployeeDataContext.Employees:get总是 return null;
  • @Binkan Salaryman 是的,在主窗口构造函数中初始化时 iis DataContext = new EmployeeDataContext() ; EmployeeDataContext.Employees:get 将返回 null 然后它将通过查询数据库(linq)获取集合

标签: c# wpf linq telerik


【解决方案1】:

从 BeginEdit 和 EndEdit 的代码隐藏中的事件处理程序的 evenargs 中提取 DataConext 对象。

然后调用您的视图模型的 Delete 方法,引用获取的 DataContext。

【讨论】:

    【解决方案2】:

    我不能 100% 确定我完全理解您的问题,但如果您询问如何将自定义 Remove 方法添加到 ObservableCollection&lt;T&gt; 类,那么您可以使用 Extension Methods。也许是这样的:

    public static class ExtensionMethods
    {
        public static bool Remove<T>(this ObservableCollection<T> collection)
        {
            var someObject;
            // custom logic here
            return collection.Remove(someObject);
        }
    }  
    

    【讨论】:

    • 我不太确定这是否可行,因为它实际上隐藏旧方法!最后一行可能会导致递归,并且尝试调用扩展方法将调用ObservableCollection&lt;T&gt;实际 Remove 方法。我建议将其正确命名为RemoveWithLogicX
    • 再次查看并注意这次Remove&lt;T&gt; 中的'&lt;T&gt;'。这是一种通用方法,与 ObservableCollection&lt;T&gt; 类中的默认方法不同。
    • 即使它有效 - 它往往会让人感到困惑,因为通用变体会使用 custom logic 而非通用不会。如果没有泛型参数,编译器可能会推断出类型。不要生我的气,但我要为糟糕的设计投反对票。
    • 主要问题是没有像 btn_Click() 这样的 raddataform 事件处理程序,它隐含地取决于您正在使用的列表或集合。ex ObservableCollection 具有添加、删除功能。这里是完整代码:[链接]demos.telerik.com/silverlight/#DataForm/FirstLook
    • 然后创建一个扩展 ObservableCollection&lt;T&gt; 类的类并覆盖 Remove 方法以将您的自定义逻辑放入其中。
    猜你喜欢
    • 1970-01-01
    • 2017-07-30
    • 1970-01-01
    • 2018-12-23
    • 1970-01-01
    • 2012-10-04
    • 1970-01-01
    • 1970-01-01
    • 2015-07-13
    相关资源
    最近更新 更多