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

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

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

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

XAML

XAML(Extensible Application Markup Language)はWPF、Silverlight、Windows PhoneそしてWindows Store appsでユーザーインターフェースを定義するために使われるXML言語です。

データバインディング

データソースと、アプリケーションやウェブページ(ウェブアプリケーション)のユーザインタフェースを静的または動的に結合する技術です。

WPF

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

Q&A

解決済

1回答

4859閲覧

【C# WPF】コレクションに格納したデータがViewに表示されない

Riz.

総合スコア1

C#

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

XAML

XAML(Extensible Application Markup Language)はWPF、Silverlight、Windows PhoneそしてWindows Store appsでユーザーインターフェースを定義するために使われるXML言語です。

データバインディング

データソースと、アプリケーションやウェブページ(ウェブアプリケーション)のユーザインタフェースを静的または動的に結合する技術です。

WPF

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

1グッド

0クリップ

投稿2020/07/01 08:41

前提・実現したいこと

ViewModelで格納したデータをViewで表示したい

お世話になっております。
stringで宣言したNameメンバとintで宣言したAgeメンバを持つPersonクラスを
データとしてViewModelに持たせて、ListBoxにバインドさせているのですが、バインドさせたデータがViewに表示されません。
どうしたらViewに表示されるかご教授をお願い致します。

該当のソースコード

C#

1【ViewModel.cs】 2 3namespace ViewModel 4{ 5 public class ViewModel 6 { 7 public ObservableCollection<Person> people { get; private set; } 8 9 public ViewModel() 10 { 11 people = new ObservableCollection<Person>(Enumerable.Range(1, 100) 12 .Select(x => new Person 13 { 14 Name = "aaa" + x, 15 Age = (30 + x) % 50 16 })); 17 } 18 } 19 public class Person 20 { 21 public string Name 22 { 23 get; 24 set; 25 } 26 public int Age 27 { 28 get; 29 set; 30 } 31 } 32} 33

XAML

1<Window x:Class="Test.MainWindow" 2 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 3 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 4 xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 5 xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 6 xmlns:local="clr-namespace:ViewModel" 7 xmlns:vm="clr-namespace:ViewModel" 8 mc:Ignorable="d" 9 Title="Test" Height="720" Width="960"> 10 11 <Window.DataContext> 12 <vm:ViewModel/> 13 </Window.DataContext> 14 15<Grid> 16 <Grid.RowDefinitions> 17 <RowDefinition Height="Auto" /> 18 <RowDefinition Height="Auto"/> 19 <RowDefinition Height="*"/> 20 <RowDefinition Height="*"/> 21 <RowDefinition Height="*"/> 22 <RowDefinition Height="*"/> 23 <RowDefinition Height="*"/> 24 <RowDefinition Height="*"/> 25 <RowDefinition Height="*"/> 26 <RowDefinition Height="*"/> 27 </Grid.RowDefinitions> 28 29 <Grid.ColumnDefinitions> 30 <ColumnDefinition Width="*"/> 31 <ColumnDefinition Width="6*"/> 32 </Grid.ColumnDefinitions> 33 34 <ScrollViewer Grid.Row="2" Grid.RowSpan="8" Grid.Column="1" HorizontalScrollBarVisibility="Visible" VerticalScrollBarVisibility="Hidden"> 35 <ListBox 36 ItemsSource="{Binding people}"> 37 <ListBox.ItemTemplate> 38 <DataTemplate> 39 <StackPanel> 40 <TextBlock Text="{Binding people.Age}" /> 41 <TextBlock Text="{Binding people.Name}" /> 42 </StackPanel> 43 </DataTemplate> 44 </ListBox.ItemTemplate> 45 </ListBox> 46 </ScrollViewer> 47</Grid>

###問題点
Viewの一部切り取り
画像のようにスクロールバーとListBoxは生成されるがTextが表示されない

試したこと

DataGridにデータをバインド→表示された
イメージ説明

XAML

1・変更点のみ記載 2<DataGrid ItemsSource="{Binding people}" Grid.Row="2" Grid.RowSpan="8" Grid.Column="1"/> 3(ScrollViewerはコメントアウトされています)

ViewModelを解せず直接XAML.csにデータを持たせた→表示された
イメージ説明

C#

1【MainWindow.xaml.cs】 2namespace Main 3{ 4 public partial class MainWindow : Window 5 { 6 public ObservableCollection<Person> people { get; private set; } 7 public MainWindow() 8 { 9 InitializeComponent(); 10 people = new ObservableCollection<Person>(Enumerable.Range(1, 100) 11 .Select(x => new Person 12 { 13 Name = "aaa" + x, 14 Age = (30 + x) % 50 15 })); 16 this.DataContext = people; 17 } 18 } 19}

XAML

1・前述のコードからの変更点のみ記載 2 3・ViewModelとの紐付けをコメントアウト 4 <!--<Window.DataContext> 5 <vm:ViewModel/> 6 </Window.DataContext>--> 7 8・Bindingの名前を変更 9 <ListBox 10 ItemsSource="{Binding }"> 11 <ListBox.ItemTemplate> 12 <DataTemplate> 13 <StackPanel> 14 <TextBlock Text="{Binding Age}" /> 15 <TextBlock Text="{Binding Name}" /> 16 </StackPanel> 17 </DataTemplate> 18 </ListBox.ItemTemplate> 19 </ListBox>

これをViewModelにデータを持たせた状態で実現させたいです
おそらくバインドのやり方が間違っている?と思うのですが正しいやり方が分かりません
どうが教えていただきますと幸いです。よろしくお願いいたします。

TN8001👍を押しています

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

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

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

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

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

guest

回答1

0

ベストアンサー

DataContextは基本的に親(上位のコントロール)の値を引き継ぎますが、ListBoxのようにコレクションをソースにとるものの場合、下位のListBoxItemにはコレクション中の1個がDataContextにセットされます。

ItemTemplateではすでに個々のPersonになっているため、↓こういうことになります。

xml

1<ListBox ItemsSource="{Binding people}"> 2 <ListBox.ItemTemplate> 3 <DataTemplate> 4 <StackPanel> 5 <TextBlock Text="{Binding Age}" /> 6 <TextBlock Text="{Binding Name}" /> 7 </StackPanel> 8 </DataTemplate> 9 </ListBox.ItemTemplate> 10</ListBox>

変更後のコードもthis.DataContext = this;としたとすると同じになります。


元コードを実行したときに、↓のようなエラーが出力ウィンドウに大量に出ていたと思います。

System.Windows.Data Error: 40 : BindingExpression path error: 'people' property not found on 'object' ''Person' (HashCode=35943562)'. BindingExpression:Path=people.Age; DataItem='Person' (HashCode=35943562); target element is 'TextBlock' (Name=''); target property is 'Text' (type 'String')

Personにはpeopleプロパティがないので、TextBlockTextに値をセットできません。」のような意味なので、「あれ?ここにはPersonが入ってきているのか!」と気付くことができます。

投稿2020/07/01 09:36

編集2023/08/11 08:45
TN8001

総合スコア9807

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

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

Riz.

2020/07/01 11:24

出力ウィンドウを見るのを失念しておりました・・・ 迅速で分かりやすい回答ありがとうございました。とても助かりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.37%

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

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

質問する

関連した質問