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

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

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

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

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

解決済

2回答

3706閲覧

[WPF]DataGridにViewModelのプロパティをバインドしたい

K.KATSU2

総合スコア10

DataGrid

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

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クリップ

投稿2021/04/25 18:14

編集2023/07/27 01:20

前提・実現したいこと

MainWindowにDataGridなどを配置したユーザコントロールを表示させるのですが、
このDataGridにはチェックボックスや文字列、ボタンを表示させたいと思っています。
このとき、DataGridの文字列はViewModelからバインドしたい、かつボタンやチェックボックス押下のアクションをViewModelで行いたいと思っておりますが、うまくいきませんでした。

該当のソースコード

[UsercontrolのXaml]

Xaml

1<UserControl x:Class="TEST.Views.TESTList" 2 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 3 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 4 xmlns:prism="http://prismlibrary.com/" 5 xmlns:viewmodels="clr-namespace:TEST.ViewModels" 6 xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 7 xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 8 mc:Ignorable="d" 9 d:DataContext="{d:DesignInstance Type=viewmodels:TESTListViewModel}" 10 prism:ViewModelLocator.AutoWireViewModel="True"> 11 <Grid> 12 <StackPanel> 13 <DataGrid Name="dataGrid" AutoGenerateColumns="False" CanUserAddRows="False" IsReadOnly="True" 14 ScrollViewer.HorizontalScrollBarVisibility="Disabled" Height="270" 15 ItemsSource="{Binding ActiveFiles}"> 16 <DataGrid.Columns> 17 <DataGridTemplateColumn Header="" Width="10"> 18 <DataGridTemplateColumn.CellTemplate> 19 <DataTemplate> 20 <CheckBox IsChecked="False"/> 21 </DataTemplate> 22 </DataGridTemplateColumn.CellTemplate> 23 </DataGridTemplateColumn> 24 <DataGridTextColumn Header="名前" Binding="{Binding FileName}" MinWidth="300" Width="*"/> 25 <DataGridTextColumn Header="担当" Binding="{Binding Person}" Width="75"/> 26 <DataGridTextColumn Header="ステータス" Binding="{Binding Status}" Width="50"/> 27 <DataGridTemplateColumn Width="50"> 28 <DataGridTemplateColumn.CellTemplate> 29 <DataTemplate> 30 <Button Content="確認" Command="{Binding ShowStatusCheck}"/> 31 </DataTemplate> 32 </DataGridTemplateColumn.CellTemplate> 33 </DataGridTemplateColumn> 34 </DataGrid.Columns> 35 </DataGrid> 36 <Button Content="実行" Margin="430,5,5,5"/> 37 </StackPanel> 38 </Grid> 39</UserControl> 40

試したこと

以前の質問の回答から応用して解決できると思っていたのですが、まだ理解が及んでおらず行き詰っております。

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

・VisualStudio2019
・C# PWF(Prismフレームワーク使用)

TN8001👍を押しています

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

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

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

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

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

guest

回答2

0

投稿2021/05/16 07:04

K.KATSU2

総合スコア10

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

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

0

ベストアンサー

うまくいきませんでした。

では情報0です。どこまでできて何がうまくいっていないかを、他人にも伝わるように書いてください。

なにかエラーは出ていませんか?

重大度レベル データ コンテキスト バインド パス ターゲット ターゲット型 説明 ファイル 行 プロジェクト エラー ActiveFileList ShowStatusCheck Button.Command ICommand 型 ActiveFileList のオブジェクトに ShowStatusCheck プロパティが見つかりません。

まあこういうことなんでしょうけど。

xml

1<Button Command="{Binding DataContext.ShowStatusCheck, RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}}" Content="確認" />

StatusCheckExecuteはなぜメインでやる必要があるのかわかりませんが、そういう場合はApplicationCommandsがよさそうです。

Composite Commands | Prism

投稿2021/04/26 09:36

編集2023/07/26 16:20
TN8001

総合スコア9244

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

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

K.KATSU2

2021/04/26 11:58

いつもお世話になっております。 また、回答いただきましてありがとうございます。 困っている具体的な点としましては、 ActiveFileListのリストActiveFilesを「ItemsSource」として各カラムにバインドさせたいのですが、バインドして値を表示させることができていない状況です。 バインド法は大きく間違っていないのでは?と思っている分厄介だなと感じているところです。
TN8001

2021/04/26 13:47

あ、各行が出ないんですか。 バインドエラーはないのですか? あればそれを追記してください。 ないのであれば、ActiveFilesがカラ(0件)としか思えないですね。 ブレークポイントを仕掛けて再度確認や、例えばダミーのデータを追加するボタン等を作ってどこまでは想定通りなのかをはっきりさせましょう。
K.KATSU2

2021/04/26 14:19 編集

ご回答いただきありがとうございます。 ActiveFilesですが、プログラム起動時にテストデータを取り込んで2つのインスタンスをListで持つようにしておりますが、ブレークポイントで確認しても持っていることが確認できております。 以下のコードについてBinding 以降のプロパティの指定法が微妙に間違っているのかなと疑っております。 ```Xaml <DataGridTextColumn Header="ファイル名" Binding="{Binding FileName}" MinWidth="300" Width="*"/> <DataGridTextColumn Header="担当" Binding="{Binding Person}" Width="75"/> <DataGridTextColumn Header="ステータス" Binding="{Binding Status}" Width="50"/> ``` また、DataGrid タグで「ItemsSource="{Binding DataContext.ActiveFiles}"」と記述しバインドしようとすると、以下のバインドエラーが出てしまいます。 ``` 重大度レベル データ コンテキスト バインド パス ターゲット ターゲット型 説明 ファイル 行 プロジェクト エラー WIPListViewModel DataContext.ActiveFiles DataGrid.ItemsSource、名前 = 'dataGrid' IEnumerable 型 WIPListViewModel のオブジェクトに DataContext プロパティが見つかりません。 ```
K.KATSU2

2021/04/26 14:22

つきましては、コレクションの作成まではうまくいっているので、あとはバインドさせるだけなのですがおそらくパスや名前空間の指定などで失敗しているのだろうと考えております。
TN8001

2021/04/26 14:52

整理します UserControl WIPList の DataContext は WIPListViewModelです。 AutoWireViewModelしていますし ItemsSource="{Binding DataContext.ActiveFiles}" としたときのエラーからもはっきりしています。 ですから ItemsSource="{Binding ActiveFiles}" でいいはずです。 <DataGridTextColumn Header="ファイル名" Binding="{Binding FileName}" ここについても各アイテム(ActiveFileList)が入ってきますのであっています。 つまり提示コードにはこれと言っておかしい点はありません(こちらの手元でも動いています) バインドエラーが出ていないという点もそれを示唆しています。 ということは提示コード以外に要因があると思います。 WIPList自体は出ている(カラムヘッダやボタンは出ている)んですよね? WorkInProcessList.DBをいったんやめて、適当なデータを直接Addしてみたらどうなるのか。 あたりでしょうか? > ダミーのデータを追加するボタン等を作って これも試してみたらどうなるでしょうか?
K.KATSU2

2021/04/26 21:32 編集

ご回答ありがとうございます。 そちらの環境で正常動作していると聞けたことで、認識に確信を持つことができ原因がわかりました。 まだ勉強段階で、いろいろ試してしまった結果 DataGridに「dataGrid」という名前を付けたことで、WIPListクラスで直接値を入れる仕組みを作ってしまっており、以下のコードを残しておりました。 --------- dataGrid.ItemsSource = new ObservableCollection<ActiveFileList>() { //new ActiveFileList{FileName = @"C:\test.txt",Person="上畠克仁",Status="3"} }; ---------- よくよく見たら、 中身のインスタンス化のみを消すだけでなくすべてを消さないといけないことに気づくことができました。 ◎ ただ、ここで1つまだ理解できていないことがございます。 Buttonについてはなぜ以下のようにDataContext.ShowStatusCheck としないといけないのでしょうか? <Button Command="{Binding DataContext.ShowStatusCheck, RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}}"/>
TN8001

2021/04/26 22:32

{Binding FileName} や {Binding Person} としていますよね? これはどうみても ActiveFileList クラスのプロパティです。 ActiveFileList クラスに ShowStatusCheck はありません。 だから {Binding ShowStatusCheck} ではエラーです。 2個前の質問でもそうでしたが、コレクションを ItemsSource にとるようなコントロールはこの段階({Binding FileName} と書くような場所)では、WPFが気を利かせて個々のアイテムが DataContext にセットされているのです。 だから {Binding FileName} と書けるのです。 しかし WIPListViewModel にバインドしたい場合は、ビジュアルツリーをさかのぼって DataContext が WIPListViewModel のところを探してきた上で、探したものはコントロール自体なので DataContext をつけて {Binding DataContext.ShowStatusCheck, RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}} と書かなくてはなりません。 ある程度は仕方がないところはあるのですが、RelativeSource が頻発するようだと設計が間違っています。 AncestorType は DataGrid である必要はないのですが、直近で確実にいること・DataGrid 内のテンプレートに紛れ込んでいないものという観点で選んでいます。 参考 [ツリー - WPF .NET Framework | Microsoft Docs](https://docs.microsoft.com/ja-jp/dotnet/desktop/wpf/advanced/trees-in-wpf?view=netframeworkdesktop-4.8 [WPF ツリー ビジュアライザーを使用する - Visual Studio | Microsoft Docs](https://docs.microsoft.com/ja-jp/visualstudio/debugger/how-to-use-the-wpf-tree-visualizer?view=vs-2019
K.KATSU2

2021/04/26 23:16

ご教授いただきありがとうございます。 とても助かりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問