【问题标题】:Keep SelectedItem during filter of CollectionViewSource在 CollectionViewSource 过滤期间保留 SelectedItem
【发布时间】:2013-06-10 15:18:03
【问题描述】:

我有一个像这样被过滤的列表框:

var view = CollectionViewSource.GetDefaultView(FilterSource);
view.Filter = FilterCode;

当过滤器与这样的视图模型代码一起使用时,我遇到了SelectedItem 丢失的问题:

VM
{
    public ObservableCollection<Model> Items{get;set;}
    public Model SelectedItem
    {
        get{return _selectedItem;}
        set{_selectedItem = value; NotifyPropertyChanged();}
    }
}

应用过滤器时,SelectedItem 设置为 null。但是,我想保留该选定项目,除非用户实际单击它。如果删除了过滤器,则仍应选择所选项目。该模型确实有一个IsSelected 属性,我一直在想办法查询IsSelected 属性。但是,视图的绑定不会像我期望的那样工作....或者至少我在循环中认为它不能

【问题讨论】:

  • 如果您的收藏有某种主键,您可以在过滤前保存此 id,并在过滤后尝试使用此 id 设置所选项目

标签: c# .net wpf binding .net-4.0


【解决方案1】:

您可以通过创建一个始终将当前选定项目添加到已过滤项目的过滤器来解决此问题。如果这不能直接完成,只需将所选项目保存在单独的变量中即可。

【讨论】:

    【解决方案2】:

    我遇到了类似的问题,列表框显示为选项卡式视图。我通过创建一个转换器来为“isActive”生成一个布尔标志并将其分配给 CollectionViewSource.IsLiveFilteringRequested,从而解决了这个问题。这会阻止非活动列表框更新所选项目。

    【讨论】:

      【解决方案3】:

      我在这里完成修复的唯一方法是在 SelectionChanged 事件中进行以下操作:

      if (e.AddedItems.Count == 0 && e.RemovedItems.Count >= 0)
          SpecialtyListBox.SelectedItem = e.RemovedItems[0];
      

      但是,这似乎真的很hacky,并且一旦选择了初始项目,就必须始终选择一个项目。在这种情况下,这可能会起作用,但我仍然想看看是否有人有更好的解决方案?

      【讨论】:

      • 绝对是 hacky 的感觉,但我确实有这个要求。我有一个清单,总是选择 1 个(并且只有 1 个)。所以这个解决方案实际上很完美!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-24
      • 1970-01-01
      • 2011-09-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多