首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ICollectionView ui未更新

ICollectionView ui未更新
EN

Stack Overflow用户
提问于 2020-08-02 14:33:12
回答 3查看 236关注 0票数 0

我有与ICollectionView关联的ObserveCollection (实体),在我尝试删除该条目之前,一切工作正常。单击“删除”按钮后,界面不会更新。如果我设置了ObserveCollection,一切都会正常工作

代码语言:javascript
复制
private ICollectionView _taskview;
public ICollectionView TasksView 
{
    get { return _taskview; }
    set
    {
        _taskview = value;
        OnPropertyChanged("TaskView");
    }
}
public ICommand DeleteTask
{
    get
    {
        return new DelegateCommand(() =>
        {
            _context.Task.Attach(SelectTask);
            _context.Task.Remove(SelectTask);
            _context.SaveChanges();
            Tasks = new ObservableCollection<TaskModel>(_context.Task);
            TasksView = CollectionViewSource.GetDefaultView(Tasks);
        });
    }
}

public HomeViewModel(Window window)
{
    this.window = window;
    Tasks = new ObservableCollection<TaskModel>(_context.Task);
    TasksView = CollectionViewSource.GetDefaultView(Tasks);
}


  <ListBox Grid.Row="1" Grid.RowSpan="2" Grid.Column="0"
                    SelectionMode="Extended"
                    ItemsSource="{Binding TasksView}"
                    SelectedItem="{Binding SelectTask}">
        </ListBox>
EN

回答 3

Stack Overflow用户

发布于 2020-08-02 15:41:40

在CollectionViewSource的View属性上调用Refresh()以刷新它。

票数 0
EN

Stack Overflow用户

发布于 2020-08-03 19:13:18

不要在每次删除后创建新的集合。这将对性能产生负面影响。这就是您使用ObservableCollection的原因。这样,绑定目标(例如ListBox )能够仅更新改变的项,而不是重新创建/呈现完整的视图。

在这种情况下,将数据源公开为ICollectionsView也没有意义。而是直接绑定到ObservableCollection

ICollectionsView的源集合像ObservableCollection<T>一样实现INotifyCollectionChanged时,当源发生变化时,ICollectionView将自动更新。

在这种情况下,操作INotifyCollectionChanged集合就足够了。

如果ICollectionsView的源集合不像List<T>那样实现INotifyCollectionChanged,那么当源发生变化时,ICollectionView不会自动更新。

在这种情况下,您必须显式地调用ICollectionView.Refresh来强制更新ICollectionView

请注意,您永远不应该在视图模型中引用任何视图组件--没有例外。这就消除了MVVM的所有优势。当然,这从来都不是必要的。如果您的视图模型需要对视图组件的引用,则说明您的代码或类设计错误。要遵循这个基本的、基本的MVVM设计规则,必须从HomeViewModel中删除对Window的引用。

您可以通过公开视图模型上的属性来触发视图行为,该属性是视图中数据触发器的输入。Patterns - WPF Apps With The Model-View-ViewModel Design PatternThe Model-View-ViewModel Pattern.

第一个解决方案(推荐)

您应该直接绑定到Tasks集合。

当您需要操作集合的视图时,例如,应用过滤器时,使用CollectionViewSource.GetDefaultView(Tasks)检索视图。但是不要绑定到它上面。

代码语言:javascript
复制
<ListBox ItemsSource="{Binding Tasks}" />

public HomeViewModel()
{
  Tasks = new ObservableCollection<TaskModel>(_context.Task);
  Tasks.CollectionChanged += OnTasksChanged;
}

private void OnTasksChanged(object sender, NotifyCollectionChangedEventArgs e)
{
  switch (e.Action)
  {
    case NotifyCollectionChangedAction.Add:
    {
      foreach (TaskModel task in e.NewItems)
      {
        _context.Task.Add(task);
        _context.SaveChanges();
      }
      break;
    }
    case NotifyCollectionChangedAction.Remove:
    {
      foreach (TaskModel task in e.OldItems)
      {
        _context.Task.Attach(task);
        _context.Task.Remove(task);
        _context.SaveChanges();
      }
      break;
    }
  }
}

// Then simply manipulate the 'Tasks' collection
public ICommand DeleteTaskCommand => new DelegateCommand(() => Tasks.Remove(SelectTask));

第二种解决方案

如果您希望绑定到ICollectionView,则不再需要额外的ObservableCollection (除非您希望在每次添加/移动/删除/重置操作时维护两个集合和一个ICollectionView )。要更新集合的视图,请调用ICollectionView.Refresh

代码语言:javascript
复制
<ListBox ItemsSource="{Binding TasksView}" />

public HomeViewModel()
{
  TasksView = CollectionViewSource.GetDefaultView(_context.Task);
}


// Then simply refresh the 'TasksView': 
public ICommand DeleteTask => DelegateCommand(
  () =>
  {
    _context.Task.Attach(SelectTask);
    _context.Task.Remove(SelectTask);
    _context.SaveChanges();

    // Update the view
    TasksView.Refresh();
  });
票数 0
EN

Stack Overflow用户

发布于 2020-08-05 14:55:17

你有一个打字错误:

代码语言:javascript
复制
public ICollectionView TasksView 
{
    get { return _taskview; }
    set
    {
        _taskview = value;
        OnPropertyChanged("TaskView");
    }
}

OnPropertyChanged("TaskView");,它应该是OnPropertyChanged("TasksView");

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63213085

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档