🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
C#

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

WPF

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

Q&A

解決済

1回答

2160閲覧

WPF/C#でのリスト表示について

sarupar

総合スコア2

C#

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

WPF

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

1グッド

0クリップ

投稿2021/03/16 10:39

編集2021/03/16 11:33

WPF/C#で教えてもらいたいのですが。
今WPF,C#を学習中でして、見よう見まねで、リストにObservableCollectionなるものを使用してサンプルデータを表示しようとしています。
ですが、何が悪いのか、リストにデータが表示されません。
どのように修正すればよいのか、教えてもらえないでしょうか。
以下のコードになりますが、よろしくお願いします。

(MainWindow.xaml)
'
<Window x:Class="WpfApp1.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:local="clr-namespace:WpfApp1" d:DataContext="{d:DesignInstance Type=local:MainWindowViewModel}" mc:Ignorable="d" Title="MainWindow" Height="450" Width="800">
<Grid>
<ListView x:Name="SystemLog" HorizontalAlignment="Left" Width="550" ItemsSource="{Binding DATEList}" Margin="0,30,0,40">
<ListView.View>
<GridView>
<GridViewColumn Width="500">
<GridViewColumn.CellTemplate>
<DataTemplate>
<TextBlock Text="{Binding Item.Date, ConverterCulture=en-US}" FontSize="16" HorizontalAlignment="Left"/>
</DataTemplate>
</GridViewColumn.CellTemplate>
</GridViewColumn>
</GridView>
</ListView.View>
</ListView>
</Grid>
</Window>
'

(MainWindowViewModel.cs)
'using System;
using System.Collections.ObjectModel;
using System.ComponentModel;
namespace WpfApp1
{
class MainWindowViewModel:INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
private ObservableCollection<Item> _dategList = new ObservableCollection<Item>();
public MainWindowViewModel()
{
_dategList.Clear();
_dategList.Add(new Item() { Date = DateTime.ParseExact("2021/03/14", "yyyy/MM/dd", null) });
_dategList.Add(new Item() { Date = DateTime.ParseExact("2021/03/15", "yyyy/MM/dd", null) });
_dategList.Add(new Item() { Date = DateTime.ParseExact("2021/03/16", "yyyy/MM/dd", null) });
}
public ObservableCollection<Item> DATEList
{
get
{
return _dategList;
}
set
{
_dategList = value;
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(DATEList)));
}
}

} public class Item { public DateTime Date { get; set; } }

}
'

(MainWindow.xaml.cs)
'
using System;
using System.Windows;
namespace WpfApp1
{
public partial class MainWindow : Window
{
private MainWindowViewModel vm;
public MainWindow()
{
InitializeComponent();
vm = new MainWindowViewModel();
this.DataContext = vm;
}
}
}
'
========

TN8001👍を押しています

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

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

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

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

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

sinya0320

2021/03/16 11:02

とりあえず、ソースは```で囲ってインデントして下さい。 読みづらいです。 MainWindowViewModelクラスに、INotifyPropertyChangedインタフェースが無いように見えますが コードは正しいでしょうか?
guest

回答1

0

ベストアンサー

[XAML バインド エラー]ウィンドウに、エラー内容が出ているはずです。
出し方:メニューから デバッグ -> ウィンドウ -> XAML バインド エラー

重大度レベル データ コンテキスト バインド パス ターゲット ターゲット型 説明 ファイル 行 プロジェクト エラー Item Item TextBlock.Text String 型 Item のオブジェクトに Item プロパティが見つかりません。 \mainwindow.xaml 25 Questions328202

[XAML バインド エラー]ウィンドウがない場合は、[出力]ウィンドウでもいいです(単に見やすくなっているだけなので)
出し方:メニューから 表示 -> 出力

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

ざっくり言うと「Item型にItemプロパティがないので、TextBlock.Textにバインドできません」です。
つまりこの段階ではデータコンテキストは、すでに個々のアイテム(Item)になっています。

よって<TextBlock Text="{Binding Date,としてください。


よく勘違いされますが、INotioyPropertyChangedがないとバインドされないわけではありません。
ViewModelの変更がViewに反映されなくなるだけです。なので変更しないものについてはPropertyChangedを発砲する必要はありません。

しかし↓の問題があるため、実装するようにしたほうがいいのは確かです(回答コードは寿命が同じなのはわかりきっているため、実装していません)
【WPF】ViewModelがINotifyPropertyChangedを実装していないとメモリリークする件 | aridai.NET

xml

1<Window 2 x:Class="Questions328202.MainWindow" 3 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 4 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 5 xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 6 xmlns:local="clr-namespace:Questions328202" 7 xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 8 Width="800" 9 Height="450" 10 d:DataContext="{d:DesignInstance Type=local:MainWindowViewModel}" 11 mc:Ignorable="d"> 12 <Window.DataContext> 13 <local:MainWindowViewModel /> 14 </Window.DataContext> 15 <Grid> 16 <ListView ItemsSource="{Binding DATEList}"> 17 <ListView.View> 18 <GridView> 19 <GridViewColumn Header="CellTemplate"> 20 <GridViewColumn.CellTemplate> 21 <DataTemplate> 22 <TextBlock FontSize="16" Text="{Binding Date, ConverterCulture=en-US}" /> 23 </DataTemplate> 24 </GridViewColumn.CellTemplate> 25 </GridViewColumn> 26 27 <GridViewColumn DisplayMemberBinding="{Binding Date}" Header="DisplayMemberBinding" /> 28 </GridView> 29 </ListView.View> 30 </ListView> 31 </Grid> 32</Window>

cs

1using System; 2using System.Collections.ObjectModel; 3using System.Windows; 4 5namespace Questions328202 6{ 7 public class MainWindowViewModel 8 { 9 public ObservableCollection<Item> DATEList { get; } 10 11 public MainWindowViewModel() 12 { 13 DATEList = new ObservableCollection<Item>() 14 { 15 new Item { Date = DateTime.Parse("2021/03/14"), }, 16 new Item { Date = DateTime.Parse("2021/03/15"), }, 17 new Item { Date = DateTime.Parse("2021/03/16"), }, 18 }; 19 } 20 } 21 22 public class Item 23 { 24 public DateTime Date { get; set; } 25 } 26 27 public partial class MainWindow : Window 28 { 29 public MainWindow() => InitializeComponent(); 30 } 31}

投稿2021/03/16 12:00

編集2023/07/26 15:01
TN8001

総合スコア9855

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

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

sarupar

2021/03/16 12:49

初めての初歩的な質問でしたが、詳細な説明で、ありがとうございます。 回答も無いだろうと思ってました。 さらに、バインドエラーの見方がものすごく参考になりました。 本当にありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問