代码之家  ›  专栏  ›  技术社区  ›  Mathieu Guindon

筛选ComboBox.ItemsSource

  •  0
  • Mathieu Guindon  · 技术社区  · 5 年前

    我在试着做一个决定 ComboBox 过滤其 ItemsSource FilterValue 绑定到其上的字符串 Text ; 控件位于 CellEditingTemplate 属于 DataGrid ,它本身就在 DataTemplate . 这些项目都实现了一个 ICodeName Code Name ItemTemplate 这充分利用了这些优势。

    那么 DataGridRow 是一个 Foo ,一个实现 INotifyPropertyChanged 暴露了一个 Bars ICollectionView (“SuggestionBox”是继承的用户控件 组合框

    <DataGridTemplateColumn Header="Bar">
        <DataGridTemplateColumn.CellEditingTemplate>
            <DataTemplate>
                <local:SuggestionBox Text="{Binding FilterValue, UpdateSourceTrigger=PropertyChanged}"
                                     ItemsSource="{Binding Bars, UpdateSourceTrigger=PropertyChanged}"
                                     ItemTemplate="{StaticResource CodeNameDropdownTemplate}">
                </local:SuggestionBox>
            </DataTemplate>
        </DataGridTemplateColumn.CellEditingTemplate>
    </DataGridTemplateColumn>
    

    网格行项目类(

    private ICollectionView _bars;
    public ICollectionView Bars
    {
        get { return _bars; }
        set
        {
            if (_bars != value)
            {
                _bars = value;
                _bars.Filter = FilterBars;
                OnPropertyChanged();
            }
        }
    }
    
    private bool FilterBars(object obj)
    {
        var item = (ICodeName)obj;
        return string.IsNullOrEmpty(FilterValue) 
            || item.Code.Contains(FilterValue) 
            || item.Name.Contains(FilterValue);
    }
    
    private string _filterValue;
    public string FilterValue
    {
        get
        {
            return _filterValue;
        }
        set
        {
            if (_filterValue != value)
            {
                _filterValue = value;
                OnPropertyChanged();
                Bars.Refresh();
            }
        }
    }
    

    当我运行程序时,我可以看到 酒吧 二传手被击中-然而 FilterBars 永远不会调用。

    我做错了什么?

    1 回复  |  直到 5 年前
        1
  •  2
  •   redcurry    5 年前

    当我尝试类似的东西时,使用 CollectionView 实际上为我生成了一个警告:

    System.Windows.Data Warning: 53 : Using CollectionView directly is not fully supported.  The basic features work, although with some inefficiencies, but advanced features may encounter known bugs.  Consider using a derived class to avoid these problems.
    

    集合视图

    Bars = CollectionViewSource.GetDefaultView(codeNames);
    

    这将实例化一个 ListCollectionView ,它源于 . 顺便说一句 codeNames 就是我给你的 ObservableCollection<ICodeName>

    最后,即使你正在刷新 ICollectionView FilterValue setter,您仍然需要告诉WPF刷新其视图。换句话说,你需要提高工资 PropertyChanged Bars