如何过滤C#中ObservableCollection的一部分的数组

我有一个ObservableCollection个对象,其中一个AcquiredDateGroup个称为项。 AcquiredDateGroup的属性之一是称为特征的Feature对象的数组。

我有绑定到ObservableCollection的相当复杂的树视图。 AcquiredDateGroup的属性用于分组,Feature数组用于树中的最终叶子。我想根据其属性之一来过滤功能数组,可以说IsSelected,但到目前为止,我发现的所有示例都使用CollectionView和CollectionViewSource之类的方法过滤父ObservableCollection

是否可以直接过滤此数组?

AcquiredDateGroup类

 class AcquiredDateGroup : INotifyPropertyChanged
    {
        public Feature[] features { get; set; }
        public List<Item> items { get; set; }
        public DateTime acquired { get; set; }
        public string date
        {
            get
            {
                return acquired.Date.ToString("MMM dd,yyyy");
            }
        }

        public IEnumerable<object> Items
        {
            get
            {
                foreach (var item in items)
                {
                    yield return item;
                }
            }
        }

    }

功能类

public class Feature
{
    public _Links1 _links { get; set; }
    public object[] _permissions { get; set; }
    public bool IsSelected { get; set; } = false;
    public string id { get; set; }
}

非常简化的视图摘录。 :

    <TreeView Name="SearchResults" Grid.Row="3" Grid.Column="0" IsEnabled="{Binding TreeEnabled}" ItemsSource="{Binding Items}" >

<DataTemplate DataType="{x:Type model:Feature}">
     <CheckBox IsChecked="{Binding IsChecked,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" Visibility="{Binding IsSelected,Converter={StaticResource SelectCheckIconVisibiltyConverter }}"  IsEnabled="{Binding _permissions,Converter={StaticResource PermissionsConverter}}"  Margin="5,0" Focusable="False" VerticalAlignment="Center" HorizontalAlignment="Left" ToolTip="Select" Tag="{Binding Path=id}">
                                    </CheckBox>

MVVM摘录:

private ObservableCollection<Model.AcquiredDateGroup> _items;
public ObservableCollection<Model.AcquiredDateGroup> Items
{
    get
    {
        if (_items == null)
        {
            _items = new ObservableCollection<Model.AcquiredDateGroup>();
        }
        return _items;
    }
    set
    {
        _items = value;
        OnPropertyChanged("Items");
    }
}
ccyzzxt 回答:如何过滤C#中ObservableCollection的一部分的数组

在我看来,您还没有弄清楚您的要求是什么,而且您的TreeView控件的ItemTemplate设置不正确。

为简洁起见,我使用的是精简版的课程。

public class AcquiredDateGroup
{
    public int ID { get; set; }
    public ObservableCollection<Feature> Features { get; set; }
}

public class Feature
{
    public string Name { get; set; }
    public bool IsSelected { get; set; } = false;
}

想象一下,这就是我的数据:

Items = new ObservableCollection<AcquiredDateGroup>
{
    new AcquiredDateGroup() 
    { 
        ID = 1,Features = new ObservableCollection<Feature>() 
        {
            new Feature() { Name = "A",IsSelected = true },new Feature() { Name = "B",IsSelected = false },new Feature() { Name = "C",IsSelected = true } 
        } 
    },new AcquiredDateGroup() 
    { 
        ID = 2,Features = new ObservableCollection<Feature>() 
        { 
            new Feature() { Name = "D",new Feature() { Name = "E",new Feature() { Name = "F",IsSelected = false } 
        } 
    },};

现在,在您的XAML中,您需要设置一个TreeView.ItemTemplate和一个DataTemplate来显示数据。

<TreeView ItemsSource="{Binding Items}">
    <TreeView.ItemTemplate>
        <HierarchicalDataTemplate ItemsSource="{Binding Features}">
            <TextBlock Text="{Binding ID}"/>
            <HierarchicalDataTemplate.ItemTemplate>
                <DataTemplate>
                    <CheckBox Content="{Binding Name}" IsChecked="{Binding IsSelected}"/>
                </DataTemplate>
            </HierarchicalDataTemplate.ItemTemplate>
        </HierarchicalDataTemplate>
    </TreeView.ItemTemplate>
</TreeView>

这将为您提供如下输出:

enter image description here


编辑

假设您要在树视图中仅显示IsSelected == true列表中的Features个项目。然后,您应该考虑在ViewModel而不是View中进行过滤,因为使ViewViewModel脱开是理想的MVVM设计。>

因此,我将更改AcquiredDateGroup类以添加一个新的get only属性,该属性返回Features列表中IsSelectedtrue的项目。

public class AcquiredDateGroup
{
    public int ID { get; set; }
    public ObservableCollection<Feature> Features { get; set; }
    public List<Feature> FeaturesIsChecked
    {
        get
        {
            return Features.Where(x => x.IsSelected == true).ToList();
        }
    }
}

然后在您的XAML中可以绑定到该新属性。

<TreeView.ItemTemplate>
    <HierarchicalDataTemplate ItemsSource="{Binding FeaturesIsChecked}">
        <TextBlock Text="{Binding ID}"/>
        <HierarchicalDataTemplate.ItemTemplate>
            <DataTemplate>
                <CheckBox Content="{Binding Name}" 
                          IsChecked="{Binding IsSelected}"/>
            </DataTemplate>
        </HierarchicalDataTemplate.ItemTemplate>
    </HierarchicalDataTemplate>
</TreeView.ItemTemplate>

现在,您只能显示将IsSelected设置为true的项目:

enter image description here

本文链接:https://www.f2er.com/3113840.html

大家都在问