2011-07-07 24 views
1

重複なしとの結合:WPFは次のようになり、私はオブジェクトのコレクションを持っている

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のリストにそのコレクションを結合し、そしてそれは(重複なし)オブジェクトのカテゴリを表示持つことができます? (多分、そのカテゴリにありますオブジェクトの数と一緒に)

たとえば、私は2つだけのアイテム、「オフィス」と「コンピュータ」を表示するように

答えて

1

使用CollectionViewSourcePropertyGroupDescription。あなたのResources

、次の行を追加します。

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

その後は、あなたのItemsControlため、{Binding Source={StaticResource MyCollectionViewSource}}ItemsSourceを設定します。

、ヘッダーテンプレートのスタイルをItemsControl.GroupStyleプロパティを設定します。また、アイテムのDataTemplateを作成します。

は、BEA Stollnitz hereから優れたブログの記事を読んでください。

+0

多くの人が 'LINQ'で質問に答えています。私は彼らもあなたの質問を読んでいないと思うし、あなたは重複が欲しくないと読んだだけです。 – Dennis

0

をリストしたいと思いますあなたが好きなyuo行うことができ、そのWPFの美しさです。

あなたがのModelView層にをしたいとビューに結果をバインドでフォーマットを望むものを回復するためのクエリを作成します。 モデル上で最も複雑なyuorプログラムを作成してみてください。レイヤーは最終バインディングに「ダミー」のものを残すようにしてください。モデルとModelViewの内容が簡単になりますのエラーが修正されます未来

これが役に立ちます。

1

あなたは、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

私が使用するのLINQ:

List<MyObject> distinctObj = (from o in objects select o).Distinct().ToList(); 
0

あなたは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"); 
    } 
} 
関連する問題