【问题标题】:ObservableCollection<ViewModel> Children (Delete Self)ObservableCollection<ViewModel> 孩子(删除自我)
【发布时间】:2015-04-16 10:12:03
【问题描述】:

我有一个简单的可观察视图模型集合,这些视图模型具有针对该特定视图的自包含逻辑。在视图中,我有一个删除选项,它当前调用父数据来刷新/重新加载。

所以——我不喜欢通过构造函数传递父数据上下文,需要一个最佳实践答案。我怎样才能正确删除它,并相应地更新父级?我可以将 INotifyPropertyChanged 挂接到整个视图并让父级以这种方式删除吗?

【问题讨论】:

  • 显示一些代码,这样我们就可以看到你已经拥有了什么。

标签: c# mvvm viewmodel observablecollection


【解决方案1】:
  1. 我有一个简单的可观察视图模型集合,这些视图模型具有针对该特定视图的自包含逻辑。

规则:视图模型不知道使用它的特定视图。

  1. 在视图中,我有一个删除选项,它当前调用父数据来刷新/重新加载。

所以你有一个连接到视图的视图模型。这个 ViewModel 拥有一个 ObservableCollection。集合有一个 Remove(obj) 方法。因此,您确定在哪个元素上调用了 Delete 并将其从集合中删除。当您调用 RaisePropertyChanged() 时,集合将更新您的视图。如果您有收听 ViewModel 的显示部分(模式=TwoWay)。如果你的删除应该删除整个集合你可以调用 Clear() 就可以了。

【讨论】:

    【解决方案2】:

    您似乎试图打破 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
        }
    }
    

    您可以根据自己的需要和偏好以不同的方式对 Iowner 进行建模,其他示例:

    interface IOwner
    {
        IList<ChildViewModel> Children {get;}
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-11
      • 1970-01-01
      • 2019-04-18
      • 1970-01-01
      • 2011-01-01
      • 1970-01-01
      相关资源
      最近更新 更多