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

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

ただいまの
回答率

87.79%

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

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 466

score 3

前提・実現したいこと

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

該当のソースコード

[UsercontrolのXaml]

<UserControl x:Class="TEST.Views.TESTList"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:prism="http://prismlibrary.com/" 
             xmlns:viewmodels="clr-namespace:TEST.ViewModels"
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
             mc:Ignorable="d"
             d:DataContext="{d:DesignInstance Type=viewmodels:TESTListViewModel}"
             prism:ViewModelLocator.AutoWireViewModel="True">
    <Grid>
        <StackPanel>
            <DataGrid Name="dataGrid" AutoGenerateColumns="False" CanUserAddRows="False" IsReadOnly="True" 
                      ScrollViewer.HorizontalScrollBarVisibility="Disabled" Height="270"
                      ItemsSource="{Binding ActiveFiles}">
                <DataGrid.Columns>
                    <DataGridTemplateColumn Header="" Width="10">
                        <DataGridTemplateColumn.CellTemplate>
                            <DataTemplate>
                                <CheckBox IsChecked="False"/>
                            </DataTemplate>
                        </DataGridTemplateColumn.CellTemplate>
                    </DataGridTemplateColumn>
                    <DataGridTextColumn Header="名前" Binding="{Binding FileName}" MinWidth="300" Width="*"/>
                    <DataGridTextColumn Header="担当" Binding="{Binding Person}" Width="75"/>
                    <DataGridTextColumn Header="ステータス" Binding="{Binding Status}" Width="50"/>
                    <DataGridTemplateColumn Width="50">
                        <DataGridTemplateColumn.CellTemplate>
                            <DataTemplate>
                                <Button Content="確認" Command="{Binding ShowStatusCheck}"/>
                            </DataTemplate>
                        </DataGridTemplateColumn.CellTemplate>
                    </DataGridTemplateColumn>
                </DataGrid.Columns>
            </DataGrid>
            <Button Content="実行" Margin="430,5,5,5"/>
        </StackPanel>
    </Grid>
</UserControl>

試したこと

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

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

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

0

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

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

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

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


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

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

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

Composite Commands | Prism

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2021/04/27 06:26 編集

    ご回答ありがとうございます。

    そちらの環境で正常動作していると聞けたことで、認識に確信を持つことができ原因がわかりました。
    まだ勉強段階で、いろいろ試してしまった結果
    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}}}"/>

    キャンセル

  • 2021/04/27 07: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

    キャンセル

  • 2021/04/27 08:16

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

    キャンセル

0

以下、参考URL
https://thinkami.hatenablog.com/entry/2014/08/23/063726

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 87.79%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る