C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[4]: WPF ListBoxのグループ化


(過去ログ 70 を表示中)

[トピック内 5 記事 (1 - 5 表示)]  << 0 >>

■40998 / inTopicNo.1)  WPF ListBoxのグループ化
  
□投稿者/ gtk2k (72回)-(2009/09/09(Wed) 12:14:46)

分類:[.NET 全般] 

開発言語はC#
WPFでアプリを作成しているのですが、データがDataTable型で用意されており、
そのDataTable型のデータをListBoxに表示する際にグループ化して表示させたいのですが
うまくいきません。どのようにすればグループ化して表示できるようになるのでしょうか?
以下に記述したソースを載せます。

記述したソースの抜粋
==XAML==
<Window.Resources>
	<CollectionViewSource x:Key="GroupSource" Source="{Binding}">   
		<CollectionViewSource.GroupDescriptions>   
			<PropertyGroupDescription PropertyName="GROUPCOLUMN" />   
		</CollectionViewSource.GroupDescriptions>   
	</CollectionViewSource>  
</Window.Resources>
<ListBox x:Name="lbGroup" ItemsSource="{Binding Source={StaticResource GroupSource}}">
	<ListBox.Resources>
		<DataTemplate x:Key="GroupHeaderTemplate">
			<TextBlock Text="{Binding Path=GROUPCOLUMN}"/>
		</DataTemplate>
	</ListBox.Resources>
	<ListBox.GroupStyle>
        		<GroupStyle HeaderTemplate="{StaticResource GroupHeaderTemplate}"/>
	</ListBox.GroupStyle>
</ListBox>

==Code==
Window1() //ListBoxがあるウィンドウのコンストラクタ
{
	DataTable dt = GetData(); // SQL結果セット取得
	CollectionView cv = (CollectionView)CollectionViewSource.GetDefaultView(dt.DefaultView);
	PropertyGroupDescription groupDescription = new PropertyGroupDescription();
	groupDescription.PropertyName = "GROUPCOLUMN";
	cv.GroupDescriptions.Add(groupDescription);
	this.lbGroup.DisplayMemberPath = "GROUP_NAME";
	((CollectionViewSource)this.Resources["GroupSource"]).Source = cv;
}

引用返信 編集キー/
■41011 / inTopicNo.2)  Re[1]: WPF ListBoxのグループ化
□投稿者/ Hongliang (462回)-(2009/09/09(Wed) 15:32:55)
> DataTable dt = GetData(); // SQL結果セット取得
> CollectionView cv = (CollectionView)CollectionViewSource.GetDefaultView(dt.DefaultView);
> PropertyGroupDescription groupDescription = new PropertyGroupDescription();
> groupDescription.PropertyName = "GROUPCOLUMN";
> cv.GroupDescriptions.Add(groupDescription);
> this.lbGroup.DisplayMemberPath = "GROUP_NAME";
> ((CollectionViewSource)this.Resources["GroupSource"]).Source = cv;
XAML で既にグループに使う PropertyGroupDescription 及び PropertyName は記述済みのようですが、
なぜそれらをわざわざコードでさらに追加しているのでしょうか?
これでは二重のグルーピングになりかねません。
また、CollectionViewSource.Source は直接 DataTable または DataView を使用します。
グループ化は CollectionViewSource の GroupDescriptors に記述するようにします(記述済みですが)。
変更する場合も、このCollectionViewSource の GroupDescriptios に対して行います。
というか、そもそも XAML で CollectionViewSource.Source は Binding で記述してるんですから、
Window の DataContext に DataTable/DataView が設定されることが期待されているんではないでしょうか?


> <ListBox.Resources>
> <DataTemplate x:Key="GroupHeaderTemplate">
> <TextBlock Text="{Binding Path=GROUPCOLUMN}"/>
> </DataTemplate>
> </ListBox.Resources>
この DataTemplate は GroupStyle.HeaderTemplate で使用されていますが、
グループ化に CollectionViewSource.GroupDescriptions を使った場合、
GroupStyle の DataContext には CollectionViewGroup オブジェクトが割り当てられます。
CollectionViewGroup クラスにはもちろん GROUPCOLUMN なんてプロパティは無いので、
このバインディングは失敗します。
どんなプロパティがあるかは MSDN でご確認ください。
引用返信 編集キー/
■41018 / inTopicNo.3)  Re[2]: WPF ListBoxのグループ化
□投稿者/ gtk2k (73回)-(2009/09/09(Wed) 17:06:31)
2009/09/09(Wed) 17:11:49 編集(投稿者)
2009/09/09(Wed) 17:07:55 編集(投稿者)
<pre><pre>2009/09/09(Wed) 17:07:15 編集(投稿者)

No41011 (Hongliang さん) に返信
> XAML で既にグループに使う PropertyGroupDescription 及び PropertyName は記述済みのようですが、
> なぜそれらをわざわざコードでさらに追加しているのでしょうか?
> これでは二重のグルーピングになりかねません。
> また、CollectionViewSource.Source は直接 DataTable または DataView を使用します。
> グループ化は CollectionViewSource の GroupDescriptors に記述するようにします(記述済みですが)。
> 変更する場合も、このCollectionViewSource の GroupDescriptios に対して行います。
> というか、そもそも XAML で CollectionViewSource.Source は Binding で記述してるんですから、
> Window の DataContext に DataTable/DataView が設定されることが期待されているんではないでしょうか?
まだ、WPF自体初心者なもので、よくよく考えてみるとそうですね。2重に設定していることになりますね。
XAMLのほうは削除し、ソースを以下のように修正しました。
とりあえず、グループヘッダー自体が表示されるようにはなりましたが、
グループ化された配下のデータ部分が表示されません。
どのようにすれば、配下のデータが表示させることができるのでしょうか?
引き続きご教授のほどよろしくお願いします。

==XAML==
<ListBox x:Name="lbGroup" ItemsSource="{Binding}">
<ListBox.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding Path=GROUP_NAME}"/>
</DataTemplate>
</ListBox.ItemTemplate>
<ListBox.GroupStyle>
<GroupStyle>
<GroupStyle.ContainerStyle>
<Style TargetType="{x:Type GroupItem}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type GroupItem}">
<Expander IsExpanded="True" BorderThickness="0,0,0,1">
<Expander.Header>
<TextBlock Text="{Binding Path=Name}"/>
</Expander.Header>
</Expander>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</GroupStyle.ContainerStyle>
</GroupStyle>
</ListBox.GroupStyle>
</ListBox>

==Code==
CollectionViewSource cvs = new CollectionViewSource();
cvs.Source = dt;
PropertyGroupDescription groupDescription = new PropertyGroupDescription();
groupDescription.PropertyName = "GROUPCOLUMN";
cvs.GroupDescriptions.Add(groupDescription);
this.lbGroup.DataContext = cvs;


</pre></pre>
引用返信 編集キー/
■41020 / inTopicNo.4)  Re[3]: WPF ListBoxのグループ化
□投稿者/ Hongliang (463回)-(2009/09/09(Wed) 17:55:30)
まず一つのことを完了させてから次のことに取りかかりましょうよ。

で、グループのヘッダに Expander を使うんですね。
MSDN の「GroupStyle.ContainerStyle プロパティ」のサンプルコードか、「方法 : GridView を実装する ListView の項目をグループ化する」かを参考にしたコードに見えますが、合ってますか?
// どこか参考にしたサイトがあるなら、その URL を書いていただくと手間が省けて助かります。
それなら、もう一度じっくりそのサンプルコードを確認してください。
Expander 周りにコピー抜けがあります。
引用返信 編集キー/
■41022 / inTopicNo.5)  Re[4]: WPF ListBoxのグループ化
□投稿者/ gtk2k (74回)-(2009/09/09(Wed) 18:53:35)
No41020 (Hongliang さん) に返信
> まず一つのことを完了させてから次のことに取りかかりましょうよ。
>
> で、グループのヘッダに Expander を使うんですね。
> MSDN の「GroupStyle.ContainerStyle プロパティ」のサンプルコードか、「方法 : GridView を実装する ListView の項目をグループ化する」かを参考にしたコードに見えますが、合ってますか?
> // どこか参考にしたサイトがあるなら、その URL を書いていただくと手間が省けて助かります。
> それなら、もう一度じっくりそのサンプルコードを確認してください。
> Expander 周りにコピー抜けがあります。

ありがとうございます。抜けてましたね。
ようやく解決することができました。
Expander配下に以下のようにExpander.Contentを追加することにより表示させることができました。
<Expander>
<Expander.Header>
</Expander.Header>
<Expander.Content>
<ListBox ItemsSource="{Binding Path=Items}">
<ListBox.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding Path=GROUP_NAME}"/>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
</Expander.Content>
</Expander>

ただ、ほとんどのサンプルにおいては、単に
<ItemsPresenter />
と書かれているだけでした。
これをこのまま書いてみたのですが表示されませんでした。
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -