WPF C # Как я могу отфильтровать ObservableCollection или QueryableCollectionView - PullRequest
0 голосов
/ 20 ноября 2018

WPF C # Как я могу отфильтровать ObservableCollection или QueryableCollectionView?

Я хочу отфильтровать и перечислить все категории, которые имеют одинаковый дублированный код категории.

Как код: Test123 состоит из этих категорий,Другими словами, код категории должен быть уникальным.

Я попробовал это с QueryableCollectionView:

var test = CategoryCollection.GroupBy(Category => Category.Code).Where(w => w.Count() > 1);

Но это не сработало.

Пример моего кода:

    public ObservableCollection<Category> GetCategory
    {
        get
        {
            this._getCategory = GetCategory();
            this._getCategory.GroupBy(category => category.Code).ToList().Where(w => w.Count() > 1); ;
            this._getCategory = new ObservableCollection<Category>(_getCategory);
            return this._getCategory.               
        }
        set
        {
            if (this._getCategory != value)
            {
                this._getCategory = value;
                this.OnPropertyChanged("GetCategory");
            }
        }
    }

Ответы [ 3 ]

0 голосов
/ 21 ноября 2018
List<Category> listResult= yourObservableCollection.GroupBy(c => c.Code)
.Select(cl=>new Caegory
{
    Code=cl.First().Code;
    // other parameters of Category here
}).ToList().Where(w=>w.Count()>1);
ObservableCollection<Category> result=new ObservableCollection<Category>(listResult);

Я не знаю о QueryableCollectionView, но для ObservableCollection это работает

0 голосов
/ 21 ноября 2018

Я сделал пример кода, который работает так, как вы описали сейчас, см. Ниже:

MainWindow.xaml

<Window x:Class="TestWpfApplication.MainWindowView"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d"
    Title="MainWindow" 
    Height="450" 
    Width="800">

<Grid>
    <Grid.ColumnDefinitions>
        <ColumnDefinition/>
        <ColumnDefinition/>
    </Grid.ColumnDefinitions>
    <Grid.RowDefinitions>
        <RowDefinition />
        <RowDefinition />
    </Grid.RowDefinitions>

    <ListBox Grid.Row="0" Grid.Column="0" Name="CategoryListBox" ItemsSource="{Binding Path=CategoryCollection}" DisplayMemberPath="Description" />
    <TextBox Grid.Row="0" Grid.Column="1" Text="{Binding ElementName=CategoryListBox, Path=SelectedItem.Code}" />
</Grid>

MainWindow.xaml.cs

using System.Windows;

namespace TestWpfApplication
{
    public partial class MainWindowView : Window
    {
        private readonly MainWindowViewModel _mainWindowViewModel = new MainWindowViewModel();

        public MainWindowView()
        {
            InitializeComponent();

            DataContext = _mainWindowViewModel;
        }
    }
}

MainWindowViewModel.cs

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Windows.Data;

namespace TestWpfApplication
{
    internal class MainWindowViewModel
    {
        private readonly List<Category> _categories;

        public MainWindowViewModel()
        {
            _categories = new List<Category>
            {
                new Category {Code = 1, Description = "Blah"},
                new Category {Code = 1, Description = "Blah"},
                new Category {Code = 2, Description = "Pop"},
                new Category {Code = 3, Description = "No"},
                new Category {Code = 3, Description = "No"},
                new Category {Code = 4, Description = "Yes"}
            };

            HookUpCategoryEvents();

            CategoryCollection = CollectionViewSource.GetDefaultView(_categories);
            CategoryCollection.Filter = OnlyShowIfMoreThanOne;
        }

        private bool OnlyShowIfMoreThanOne(object obj)
        {
             Category item = obj as Category;

             return _categories.Count(c => c.Code == item.Code) > 1;
        }

        public ICollectionView CategoryCollection { get; }

        private void HookUpCategoryEvents()
        {
            // If you add items or remove them at any point then you need to call this method
            // It removes the event so you don't get existing items being 'hooked up' double or more times

            foreach (var category in _categories)
            {
                category.CodeChanged -= CategoryOnCodeChanged;
                category.CodeChanged += CategoryOnCodeChanged;
            }
         }

        private void CategoryOnCodeChanged(object sender, EventArgs e)
        {
            CategoryCollection.Refresh();
        }
    }
}

Category.cs

using System;

namespace TestWpfApplication
{
    public class Category
    {
        private int _code;
        private string _description;

        public event EventHandler CodeChanged;

        public int Code
        {
            get => _code;
            set
            {
                if (_code != value)
                {
                    _code = value;
                    OnCodeChanged();
                }
            }
        }

        public string Description
        {
            get => _description;
            set => _description = value;
        }

        private void OnCodeChanged()
        {
            CodeChanged?.Invoke(this, EventArgs.Empty);
        }
    }
}

Это отображает простой ListBox, который настроен для показа свойства Description категориикласс и TextBox, который показывает SelectedItem.Code ListBox.В ViewModel ICollectionView имеет фильтр, примененный к нему, так что он показывает только элементы, эти коды появляются более одного раза.Событие вызывается из класса Category при установке свойства Code (из TextBox), которое MainWindowViewModel слушает и использует для вызова .Refresh () в ICollectionView.В производственном коде нет проверки или других вещей, которые вы хотели бы получить, но это должно показать вам основы того, что вы хотите.

0 голосов
/ 20 ноября 2018

var test = CategoryCollection.GroupBy (Category => Category.Code) .toList (). Где (w => w.Count ()> 1);

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...