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

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

新規登録して質問してみよう
ただいま回答率
85.48%
DataGrid

GUIの一種であり、データを表の形式でみることが可能です。

Visual Studio

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

.NET Framework

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

WPF

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

Q&A

解決済

1回答

2743閲覧

[WPF][MVVM] DataGrid で値が表示されない

Base

総合スコア28

DataGrid

GUIの一種であり、データを表の形式でみることが可能です。

Visual Studio

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

.NET Framework

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

WPF

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

1グッド

0クリップ

投稿2021/08/06 10:37

編集2021/08/06 11:06

前提・実現したいこと

WPFでMVVMアーキテクチャを利用したプログラミングを進めています。
ViewにDataGridを表示するアプリを作っています。
DataGridにデータが表示されずに困っています。何卒、ご教授をお願いいたします。

発生している問題

データがBindingされておらず(?)表示されなくて困っています。

該当のソースコード

View

Xaml

1<Window x:Class="appwpf1.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:appwpf1" 7 xmlns:vm="clr-namespace:appwpf1.VM" 8 xmlns:md="clr-namespace:appwpf1.Model" 9 mc:Ignorable="d" 10 Title="MainWindow" Height="450" Width="800"> 11 <Window.DataContext> 12 <vm:MainWindowVieModel/> 13 </Window.DataContext> 14  ・ 15  ・ 16  ・ 17<DataGrid x:Name="DataGrid1" ItemsSource="{Binding ParamA}" Grid.Row="1" IsReadOnly="True" AutoGenerateColumns="False" VerticalScrollBarVisibility="Auto" Height="40"> 18 <DataGrid.Columns> 19 <DataGridTextColumn Header="ID" Binding="{Binding ParamA.ID}" /> 20 <DataGridTextColumn Header="Name" Binding="{Binding ParamA.Name}" /> 21 <DataGridTextColumn Header="Sex" Binding="{Binding ParamA.Sex}" /> 22 <DataGridTextColumn Header="メール" Binding="{Binding ParamA.Email}" /> 23 </DataGrid.Columns> 24</DataGrid>

ViewModel

MainWindowVieModel

1 class MainWindowVieModel: Base 2 { 3 public ObservableCollection<ParamA> _observaParam { get; set; } 4 5 private Param_paramA ; 6 public Param ParamA 7 { 8 get 9 { 10 return _paramA ; 11 } 12 set 13 { 14 _paramA = value; 15 NotifyPropertyChange(nameof(ParamA)); 16 } 17 } 18 19 //コンストラクタ 20 public MainWindowVieModel() 21 { 22 ParamA= new ParamA{ ID = 1, Name= "AAA", Sex= "男", Email= "xxx@gmail.com" }; 23 } 24 }

Model

Base

1 class Base: INotifyPropertyChanged 2 { 3 4 public event PropertyChangedEventHandler PropertyChanged; 5 6 protected virtual void NotifyPropertyChange(string propertyName) 7 { 8 if (PropertyChanged != null) 9 { 10 PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 11 } 12 } 13 }

Model

ParamModel

1 class ParamModel 2 { 3 4 5 } 6 7 //パラメーター 8 public class Param 9 { 10 11 public int ID{ get; set; } 12 public string Name{ get; set; } 13 public string Sex{ get; set; } 14 public string Email{ get; set; } 15 }

試したこと

DataGridのMVVM形式での実装は下記を参考にしました
https://www.fenet.jp/dotnet/column/tool/4287/

実装方法が悪いのかと、MVVMについて調査
https://www.atmarkit.co.jp/ait/articles/1011/09/news102.html

補足情報(FW/ツールのバージョンなど)

Visual Studio2019 / .NET Framework4.5.2
Windows10

TN8001👍を押しています

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

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

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

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

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

BluOxy

2021/08/06 10:56

MainWindowVieModelクラスに _paramA が2つ定義されているようにみえますが、コンパイルは通るのでしょうか。
BluOxy

2021/08/06 10:58

もし InspectParam がコレクションでなければ、それが原因で DataGrid の ItemsSource に ParamA を Binding できないのだと思います。
Base

2021/08/06 11:05 編集

申し訳ありませんでした。Paramの間違えでした。 それに付随して、クラスの名前も間違っていましたので、修正させていただきました。
BluOxy

2021/08/06 11:25 編集

Param_paramA だと型と変数名が繋がっていてコンパイルが通りませんね。質問内容を手入力で修正しましたか。 _observaParam は ParamA という型になっていますが、そのようなクラスは定義されているのでしょうか。これも定義がなければコンパイルが通りませんね。 まずは掲示されている今見える問題(ソースコード上のコンパイルエラーであろう部分)を取り除きましょう。その問題によって裏に別の問題が隠れているかが分かりません。 コンパイルエラーを取り除いたソースコードを**手入力ではなくコピー&ペースト**で質問に記載してください。
guest

回答1

0

ベストアンサー

DataGridのMVVM形式での実装は下記を参考にしました
https://www.fenet.jp/dotnet/column/tool/4287/

ほんとうですか!?似ても似つかないように思うのですが。。

コレクションと、個々のアイテムの区別がついていないように見受けられます。

コレクションとは、ObservableCollectionList・配列等複数のアイテムを持つものです(回答コードでいえばPeople

個々のアイテムとは、コレクションの中のひとつひとつです(回答コードでいえばPerson

DataGridItemsSourceにはコレクションをバインドします。

DataGridTextColumnの段階ではDataContextは個々のアイテムになっているので、{Binding ParamA.ID}ではなく{Binding ID}とプロパティだけでよいことになります。

xml

1<Window 2 x:Class="Questions353106.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:Questions353106" 6 Width="800" 7 Height="450"> 8 <Window.DataContext> 9 <local:MainWindowVieModel /> 10 </Window.DataContext> 11 <Grid> 12 <DataGrid 13 AutoGenerateColumns="False" 14 IsReadOnly="True" 15 ItemsSource="{Binding People}"> 16 <DataGrid.Columns> 17 <DataGridTextColumn Binding="{Binding ID}" Header="ID" /> 18 <DataGridTextColumn Binding="{Binding Name}" Header="Name" /> 19 <DataGridTextColumn Binding="{Binding Sex}" Header="Sex" /> 20 <DataGridTextColumn Binding="{Binding Email}" Header="メール" /> 21 </DataGrid.Columns> 22 </DataGrid> 23 </Grid> 24</Window>

cs

1using System.Collections.ObjectModel; 2using System.Windows; 3 4namespace Questions353106 5{ 6 class Person 7 { 8 public int ID { get; set; } 9 public string Name { get; set; } 10 public string Sex { get; set; } 11 public string Email { get; set; } 12 } 13 14 class MainWindowVieModel 15 { 16 public ObservableCollection<Person> People { get; } 17 18 public MainWindowVieModel() 19 { 20 People = new ObservableCollection<Person> 21 { 22 new Person { ID = 1, Name = "AAA", Sex = "男", Email = "xxx@example.com" }, 23 }; 24 } 25 } 26 27 public partial class MainWindow : Window 28 { 29 public MainWindow() 30 { 31 InitializeComponent(); 32 } 33 } 34}

投稿2021/08/06 11:34

編集2023/07/28 15:58
TN8001

総合スコア9326

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

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

Base

2021/08/06 12:04 編集

ありがとうございました。動きました! ご指摘いただいた通り、コレクションと個々のアイテムの区別がついていなかったです。詳しく説明していただき、重ねて、感謝致します。 WPFに対する理解を深めたいと思いますが、基本的なことがわかっていないのでしょうか。。少し学習の方向性を迷っています。
TN8001

2021/08/06 12:54

> WPFに対する理解を深めたいと思いますが、基本的なことがわかっていないのでしょうか。。少し学習の方向性を迷っています。 ある程度継続して学習しないと、定着する前に忘れちゃうとかはありそうですね(お仕事だとなかなかそうもいかないんでしょうが^^; 私もWPF(C#)を始めたのはだいぶ遅いですし、書籍もこれといって持っていませんが、先人たちのおかげで日本語で十分な量の情報があります(あまりにニッチな場合は英語) まとまった情報としては、 [WPF4.5入門](https://www.slideshare.net/okazuki0130/wpf45-38048141 が、タダでいいの!?ってくらいボリュームがあります(Kindle版も有 C#使用以前は情報がなさ過ぎてつらかったというのもあり天国に感じました。 (幸い?^^;)私はWinforms時代がないのですが、Winformsに慣れすぎている場合違いが多すぎて逆に理解しにくいような気はします。 WPFでもMVVMせずにWinforms的に書くことは可能です。 しかしWPFの醍醐味はバインドだと思うので、何とか乗り越えていただきたいです。 おそらくもうひとこえだと思います。 ある段階を超えると急に目の前が開け「あぁ、そういうことか。」となるはずです。 がんばってください^^
Base

2021/08/10 09:04

ご丁寧に、URLまでいただき、ありがとうございます。   「あぁ、そういうことか。」という風になるまで、いただいたURLを参考にコーディングをしてみたいと思います。   ありがとうございました!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問