質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.31%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

.NET Framework

.NET Framework は、Microsoft Windowsのオペレーティングシステムのために開発されたソフトウェア開発環境/実行環境です。多くのプログラミング言語をサポートしています。

WPF

Windows Presentation Foundation (WPF) は、魅力的な外観のユーザー エクスペリエンスを持つ Windows クライアント アプリケーションを作成するための次世代プレゼンテーション システムです

Q&A

解決済

3回答

922閲覧

[WPF] Listboxにバインドするクラスのプロパティに応じて表示するユーザーコントロールを切り替えたい

kawauso

総合スコア56

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

.NET Framework

.NET Framework は、Microsoft Windowsのオペレーティングシステムのために開発されたソフトウェア開発環境/実行環境です。多くのプログラミング言語をサポートしています。

WPF

Windows Presentation Foundation (WPF) は、魅力的な外観のユーザー エクスペリエンスを持つ Windows クライアント アプリケーションを作成するための次世代プレゼンテーション システムです

1グッド

1クリップ

投稿2017/12/06 05:04

編集2017/12/06 05:18

お世話になっております。

行いたいこと
・PersonクラスのプロパティにはName(名前)とSex(性別)があります。
・ユーザーコントロールが2種類あります。
・ManUserControl (Person Sexプロパティが男のときに表示するUC)
・WomanUserControl (Person Sexプロパティが女のときに表示するUC)

ObservableCollection<Person> Personsに複数個追加します。
ListBoxにPersonsをバインドさせて、PersonのSexプロパティによって表示するユーザーコントロールを切り替えたいと思っています。
DataTriggerなど試してみましたが、コンパイルが通りませんでした。

方法をご存知の方、教示お願い致します。

コード

C#

1public class Person 2{ 3 public string Name { get; set; } 4 public string Sex { get; set; } 5 6 public Person(string name, string sex) 7 { 8 Name = name; 9 Sex = sex; 10 } 11} 12 13public ObservableCollection<Person> Persons { get; set; } = new ObservableCollection<Person>() 14{ 15 new Person("太郎", "男"), 16 new Person("花子", "女"), 17 new Person("洋子", "女"), 18 new Person("次郎", "男") 19};

XAML

1<ListBox ItemsSource="{Binding Persons}"> 2 <ListBox.ItemTemplate> 3 <DataTemplate> 4 5 <!-- 性別が男の場合:MenUserControl、性別が女の場合:WormanUserControlを表示させたい--> 6 7 </DataTemplate> 8 </ListBox.ItemTemplate> 9 10 <ListBox.ItemsPanel> 11 <ItemsPanelTemplate> 12 <StackPanel /> 13 </ItemsPanelTemplate> 14 </ListBox.ItemsPanel> 15</ListBox>

環境
VS2017 Pro, WPF, .NET F/W 4.5.2

TAKAYASU👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

ベストアンサー

IYEMON018さんの回答と同じですが、DataTemplateSelectorで切替可能です。
DataTemplateを定義すればUserControlでも大丈夫かと思います。
かなり適当な感じですが、

C#

1public class PersonDataTemplateSelector : DataTemplateSelector 2{ 3 public DataTemplate ManTemplate { get; set; } 4 public DataTemplate WomanTemplate { get; set; } 5 6 public override DataTemplate SelectTemplate(object item, DependencyObject container) 7 { 8 return (((Person)item).Sex == "男") ? ManTemplate : WomanTemplate; 9 } 10}

XAML

1<ListBox ItemsSource="{Binding Persons}"> 2 <ListBox.Resources> 3 <!--男用テンプレート--> 4 <DataTemplate x:Key="Man" > 5 <local:ManUserControl Width="100" Height="10"/> 6 </DataTemplate> 7 8 <!--女用テンプレート--> 9 <DataTemplate x:Key="Woman" > 10 <local:WomanUserControl Width="100" Height="10"/> 11 </DataTemplate> 12 </ListBox.Resources> 13 14 <ListBox.ItemTemplateSelector> 15 <local:PersonDataTemplateSelector ManTemplate="{StaticResource Man}" WomanTemplate="{StaticResource Woman}" /> 16 </ListBox.ItemTemplateSelector> 17</ListBox>

みたいな感じでしょうか。

投稿2017/12/06 13:19

ebiryo

総合スコア797

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kawauso

2017/12/07 00:13

回答ありがとうございます。 提示いただいたコードで目的の動作をさせることができました。 勉強になりました。ありがとうございました。
guest

0

DataTemplateSelector を使用すれば解決できます。
ただし、その場合はUserControlではなくDataTemplateを使用する必要があります。

投稿2017/12/06 11:34

IYEMON018

総合スコア202

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kawauso

2017/12/07 00:12

回答ありがとうございます。 今回はUserControlを利用できるebiryoさんの方法で実装しましたが、 次回はDataTemplateを利用する方法をきちんと調べてみたいと思います。 ありがとうございました。
guest

0

真っ当な答えは他回答のように、DataTemplateSelectorでしょう。
ただ「この程度のことにC#コードを書きたくないなぁ」と思います。

DataTriggerなど試してみましたが、コンパイルが通りませんでした。

この方針で出来なくはありません。
切り替えるのはContentPresenterContentTemplateです。
ContentPresenterが2重になるので(DataTemplateSelectorと)全く同じ意味というわけではありませんが、実用上は問題ないでしょう^^

xml

1<Window 2 x:Class="Q103520.MainWindow" 3 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 4 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 5 xmlns:local="clr-namespace:Q103520" 6 Width="800" 7 Height="450" 8 ThemeMode="System"> 9 <Grid> 10 <ListBox ItemsSource="{Binding People}"> 11 <ListBox.Resources> 12 <DataTemplate x:Key="ManTemplate"> 13 <!--<local:ManUserControl />--> 14 <StackPanel> 15 <TextBlock Text="Man" /> 16 <TextBlock Text="{Binding Name}" /> 17 </StackPanel> 18 </DataTemplate> 19 20 <DataTemplate x:Key="WomanTemplate"> 21 <!--<local:WomanUserControl />--> 22 <StackPanel> 23 <TextBlock Text="Woman" /> 24 <TextBlock Text="{Binding Name}" /> 25 </StackPanel> 26 </DataTemplate> 27 28 <DataTemplate x:Key="DefaultTemplate"> 29 <StackPanel> 30 <TextBlock Text="Unknown" /> 31 <TextBlock Text="{Binding Name}" /> 32 </StackPanel> 33 </DataTemplate> 34 </ListBox.Resources> 35 <ListBox.ItemTemplate> 36 <DataTemplate> 37 <ContentPresenter x:Name="cp" ContentTemplate="{StaticResource DefaultTemplate}" /> 38 <DataTemplate.Triggers> 39 <DataTrigger Binding="{Binding Sex}" Value=""> 40 <Setter TargetName="cp" Property="ContentTemplate" Value="{StaticResource ManTemplate}" /> 41 </DataTrigger> 42 <DataTrigger Binding="{Binding Sex}" Value=""> 43 <Setter TargetName="cp" Property="ContentTemplate" Value="{StaticResource WomanTemplate}" /> 44 </DataTrigger> 45 </DataTemplate.Triggers> 46 </DataTemplate> 47 </ListBox.ItemTemplate> 48 </ListBox> 49 </Grid> 50</Window>

cs

1using System.Collections.ObjectModel; 2using System.Windows; 3 4namespace Q103520; 5 6public partial class MainWindow : Window 7{ 8 public ObservableCollection<Person> People { get; } = [ 9 new Person("太郎", "男"), 10 new Person("花子", "女"), 11 new Person("洋子", "女"), 12 new Person("次郎", "男"), 13 ]; 14 15 public MainWindow() 16 { 17 InitializeComponent(); 18 DataContext = this; 19 } 20} 21 22public record Person(string Name, string Sex);

アプリ画像

絶対に男女しかないならいいですが、ほかの値が来る可能性がある場合は既定のContentTemplateを設定しておかないと、StackOverflowExceptionになるので注意が必要です。

投稿2024/11/22 15:24

TN8001

総合スコア10049

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.31%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問