Связывание WPF без дубликатов - PullRequest
1 голос
/ 07 июля 2011

У меня есть коллекция объектов, которые выглядят так:

List<MyObject> objects = new List<MyObject>();
objects.Add(new MyObject("Stapler", "Office"));
objects.Add(new MyObject("Pen", "Office"));
objects.Add(new MyObject("Mouse", "Computer"));
objects.Add(new MyObject("Keyboard", "Computer"));
objects.Add(new MyObject("CPU", "Computer"));

class MyObject{

    public string name;
    public string category;

    public MyObject(string n, string c){
    name=n;
    category=c;
    }

}

Можно ли связать эту коллекцию со списком в WPF и отобразить ли категории объектов (без дубликатов)? (возможно вместе с количеством объектов в этой категории)

Например, я бы хотел, чтобы в списке отображались только два элемента: «Офис» и «Компьютер»

Ответы [ 5 ]

1 голос
/ 07 июля 2011

Используйте CollectionViewSource с PropertyGroupDescription.

В вашем Resources добавьте следующее:

<Window.Resources>
    <CollectionViewSource x:Key="MyCollectionViewSource" Source="{Binding Path=CollectionPropertyOnViewModel}">
        <CollectionViewSource.GroupDescriptions>
            <PropertyGroupDescription PropertyName="Category"/>
        </CollectionViewSource.GroupDescriptions>
    </CollectionViewSource>
</Window.Resources>

Затем для ItemsControl установите ItemsSource на {Binding Source={StaticResource MyCollectionViewSource}}.

Чтобы стилизовать шаблон заголовка, установите свойство ItemsControl.GroupStyle. Также создайте DataTemplate для предметов.

Прочитайте отличный пост в блоге от Bea Stollnitz здесь .

1 голос
/ 07 июля 2011

Вы можете сделать это с помощью LINQ, например:

public class AggregateCount
{
    public string Name { get; private set; }

    public int Count { get; private set; }

    public AggregateCount(string name, int count)
    {
        this.Name = name;
        this.Count = count;
    }
}

var aggregateCounts = objects.GroupBy(o => o.category).Select(g => new AggregateCount(g.Key, g.Count()));
ObservableCollection<AggregateCount> categoryCounts = new ObservableCollection<AggregateCount>(aggregateCounts); 
0 голосов
/ 07 июля 2011

Если вы не хотите использовать Linq:

private List<MyObject> objects = new List<MyObject>();
public ObservableCollection<String> Groups
{
  get
  {  
     ObservableCollection<String> temp = new ObservableCollection<String>();
     foreach (MyObject mo in objects)
     {
       if (!temp.Contains(mo.category))
         temp.Add(mo.category)
     }
     return temp;
  }
  set
  {
     objects = value;
     RaisePropertyChanged("Groups");
  }
}
0 голосов
/ 07 июля 2011

Я бы использовал Linq:

List<MyObject> distinctObj = (from o in objects select o).Distinct().ToList();
0 голосов
/ 07 июля 2011

Вы можете делать все, что захотите, в этом и заключается прелесть WPF.

Сделайте запрос для восстановления того, что вы хотите в формате, который вы хотите в ModelView слоя и привязать результат к View .Попробуйте сделать самые сложные вещи из вашей программы на слое Model и оставьте "фиктивные" вещи для окончательного связывания, насколько это возможно, потому что вещи Model и ModelView будут проще debug и исправляют ошибки в будущем .

Надеюсь, это поможет.

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