C# 可观察收集<;ViewModel>;儿童(删除自我)

C# 可观察收集<;ViewModel>;儿童(删除自我),c#,mvvm,viewmodel,observablecollection,C#,Mvvm,Viewmodel,Observablecollection,我有一个简单的viewmodels的observablecollection,它为特定视图提供了自包含的逻辑。在视图中,我有一个删除选项,该选项当前调用父数据以刷新/重新加载 所以——我不太喜欢通过构造函数传递父数据上下文,我需要一个最佳实践答案。如何正确地删除此项,并相应地更新父项?我是否可以将INotifyPropertyChanged挂接到整个视图,并以这种方式删除父视图 我有一个简单的viewmodels的observablecollection,它为特定视图提供了自包含的逻辑 规则:v

我有一个简单的viewmodels的observablecollection,它为特定视图提供了自包含的逻辑。在视图中,我有一个删除选项,该选项当前调用父数据以刷新/重新加载

所以——我不太喜欢通过构造函数传递父数据上下文,我需要一个最佳实践答案。如何正确地删除此项,并相应地更新父项?我是否可以将INotifyPropertyChanged挂接到整个视图,并以这种方式删除父视图

  • 我有一个简单的viewmodels的observablecollection,它为特定视图提供了自包含的逻辑
  • 规则:viewmodel不知道使用它的特定视图

  • 在视图中,我有一个删除选项,该选项当前调用父数据以刷新/重新加载

  • 因此,您有一个连接到视图的ViewModel。此ViewModel保存一个ObservableCollection。集合有一个Remove(obj)方法。因此,您需要标识调用Delete的元素,并将其从集合中删除。当您调用RaisePropertyChanged()时,集合将更新您的视图。如果您有收听ViewModel的显示部分(模式=双向)。如果您删除了整个集合,您可以调用Clear()。

    您似乎试图打破ChildViewModels与ParentViewModel之间的依赖关系。您可以通过引入一个接口来实现这一点,该接口将抽象ChildViewModel需要执行的操作。然后,ChildViewModel将依赖于接口,父级将实现它。例如:

    interface IOwner
    {
        void Delete(ChildViewModel vm);
    }
    
    class ChildViewModel
    {
        private IOwner owner;
        public ChildViewModel(IOwner owner)
        {
            this.owner = owner;
        }
    
        public Delete()
        {
            owner.Delete(this);
        }
    }
    
    class ParentViewModel:IOwner
    {
        public Delete(ChildViewModel child)
        {
             //deletion logic
        }
    }
    
    interface IOwner
    {
        IList<ChildViewModel> Children {get;}
    }
    
    您可以根据自己的需要和偏好,以不同的方式为IOOwner建模,例如:

    interface IOwner
    {
        void Delete(ChildViewModel vm);
    }
    
    class ChildViewModel
    {
        private IOwner owner;
        public ChildViewModel(IOwner owner)
        {
            this.owner = owner;
        }
    
        public Delete()
        {
            owner.Delete(this);
        }
    }
    
    class ParentViewModel:IOwner
    {
        public Delete(ChildViewModel child)
        {
             //deletion logic
        }
    }
    
    interface IOwner
    {
        IList<ChildViewModel> Children {get;}
    }
    
    接口所有者
    {
    IList子项{get;}
    }
    
    显示一些代码,这样我们就可以看到您已有的代码。