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

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

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

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

Visual Studio

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

WPF

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

Q&A

解決済

1回答

8061閲覧

[WPF] ItemsControlに追加されたアイテムの表示・非表示を制御する方法

kawauso

総合スコア56

C#

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

Visual Studio

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

WPF

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

0グッド

0クリップ

投稿2017/09/25 00:34

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

行いたいこと
ItemsControlに動的に追加されたアイテムの表示・非表示をコードビハインドで制御したいです。
PersonクラスにIsVisibleプロパティなどを追加してコンバーターを用いる方法なども考えたのですが、
できるだけPersonクラスにプロパティを追加や継承して新たなクラスを作成したくありません。

なにか良い方法はありますでしょうか。
よろしくお願いいたします。

コード
```csharp
public partial class Window1 : Window
{
public ObservableCollection<Person> Persons { get; set; } = new ObservableCollection<Person>()
{
new Person(){ Name = "taro", Age = 20 },
new Person(){ Name = "jiro", Age = 18 },
new Person(){ Name = "saburo", Age = 15 }
};

public Window1() { InitializeComponent(); this.DataContext = this; } private void Button_Click(object sender, RoutedEventArgs e) { // 0番目(taro)を非表示にしたい。 } } public class Person : BindableBase //BindableBaseはINotifyPropertyChangedを継承したもの { private string _name; private int _age: public string Index { get { return _name; } set { SetProperty(ref _name, value); } } public int Index { get { return _age; } set { SetProperty(ref _age, value); } } }
XAML ```XAML <Grid> <Button Content="test" Click="Button_Click"/> <ItemsControl ItemsSource="{Binding Persons}" Name="icPersons"> <ItemsControl.ItemsPanel> <ItemsPanelTemplate> <StackPanel /> </ItemsPanelTemplate> </ItemsControl.ItemsPanel> <ItemsControl.ItemTemplate> <DataTemplate> <StackPanel Orientation="Horizontal"> <TextBlock Text="{Binding Name}"/> <TextBlock Text=":"/> <TextBlock Text="{Binding Age}"/> </StackPanel> </DataTemplate> </ItemsControl.ItemTemplate> </ItemsControl> </Grid>

環境
C# .NET 4.6, VS2017 Pro

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

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

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

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

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

ebiryo

2017/09/25 02:51

非表示にしたものを再度表示することを考慮する必要はありますか?
kawauso

2017/09/25 02:54

はい。再表示したいです。
ebiryo

2017/09/25 02:58

非表示にしたいのは常に0番目ですか?
kawauso

2017/09/25 03:16

いえ、例えば3つアイテムがあれば1回目のボタンを押した際に0番目を表示、1,2番目を非表示。次にボタンを押した際に1番目を表示、0,2番目を非表示…といった具合を想定しています。
ebiryo

2017/09/25 03:21

度々すみません。表示するのは常に1アイテムのみ、ということでしょうか? もしそうならItemsControlを用いる必然性を感じないのですが。。。
kawauso

2017/09/25 03:32

常に1アイテムを想定しております。実プログラムではPersonクラスではなく、 CanvasにEllipseを複数動的に描画したものを、ボタンを押した際にスライドショーの要領で表示できるようなものを作りたいと考えています。 Ellipseを描画するのに時間がかかりそうなのであらかじめ作成しておいて表示・非表示を切り替えようと考えていたのですが… どのような方法がよいでしょうか?
guest

回答1

0

ベストアンサー

全体の構成が分からないので何とも言えないのですが、表示対象が1アイテムのみなら、ItemsControlではなくContentControlで良いと思うのですが。

XML

1<Grid> 2 <StackPanel> 3 <Button Content="test" Click="Button_Click"/> 4 <ContentControl Name="icPersons"> 5 <ContentControl.ContentTemplate> 6 <DataTemplate> 7 <StackPanel Orientation="Horizontal"> 8 <TextBlock Text="{Binding Name}"/> 9 <TextBlock Text=":"/> 10 <TextBlock Text="{Binding Age}"/> 11 </StackPanel> 12 </DataTemplate> 13 </ContentControl.ContentTemplate> 14 </ContentControl> 15 </StackPanel> 16</Grid>

C#

1public partial class Window1 : Window 2{ 3 //表示対象のPerson一覧 4 List<Person> Source { get; set; } = new List<Person>() 5 { 6 new Person(){ Name = "taro", Age = 20 }, 7 new Person(){ Name = "jiro", Age = 18 }, 8 new Person(){ Name = "saburo", Age = 15 } 9 }; 10 11 public Window1() 12 { 13 InitializeComponent(); 14 15 //先頭をContentに設定 16 this.icPersons.Content = Source.First(); 17 } 18 19 private void Button_Click(object sender, RoutedEventArgs e) 20 { 21 //現在icPersonsのContentに設定されているPersonのリスト上の位置を取得 22 var index = Source.IndexOf(this.icPersons.Content as Person); 23 24 //次のPersonをContentに設定 25 this.icPersons.Content = Source[++index % Source.Count()]; 26 } 27}

見当違いだったら悪しからず。。。

投稿2017/09/25 04:16

ebiryo

総合スコア797

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

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

kawauso

2017/09/25 08:15

回答ありがとうございます。 おかげさまで上手く動作させることができました。 ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問