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

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

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

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

WPF

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

Q&A

解決済

1回答

5319閲覧

WPF+Datagridでカラム内配置したユーザコントロール内でバインドしたプロパティが取得出来ない。

kinkin334

総合スコア62

DataGrid

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

WPF

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

0グッド

1クリップ

投稿2017/07/31 04:46

###前提・実現したいこと
C#にてWPFでアプリを開発しています。
ユーザコントロール内にDataGridを配置して、1列を追加しそのカラムに別デザインのユーザコントロールを配置して、行データに応じて任意表示したいです。
しかし、各セルに表示されたユーザコントロールが全て初期状態されてしまい、その対処方法が見つからず困っています。
どなたか対処方法をご存知の方がいましたら、ご教示いただけると幸いです。

###発生している問題・エラーメッセージ
上記ユーザコントロールのOnPropertyChangedメソッドをoverrideしてデバッグロジックを入れて調べた処、以下の例外が発生しています

エラーメッセージ System.Windows.Data Error: 40 : BindingExpression path error: 'Info' property not found on 'object' ''B' (Name='')'. BindingExpression:Path=Info; DataItem='B' (Name=''); target element is 'B' (Name=''); target property is 'ItemsSource' (type 'D')

###該当のソースコード

C#

1DataGridの行バインドクラス(このクラスをList<T>に追加してItemsSourceにセットしています) 2 public class C 3 { 4 public Int32 Seq { get; set; } 5 public D Info { get; set; } 6 } 7 8 public class D 9 { 1011 }

xaml

1DataGridを配置したユーザコントロールソース 2 <UserControl 34 <DataGrid x:Name="grdInterviewList" 5 CanUserSortColumns="False" 6 CanUserReorderColumns="False" 7 CanUserResizeColumns="False" 8 CanUserResizeRows="False" 9 FontSize="16" 10 HeadersVisibility="None" 11 HorizontalScrollBarVisibility="Disabled" 12 ItemsSource="{Binding}" 13 SelectionUnit="Cell" 14 SelectionMode="Single" 15 RowDetailsVisibilityMode="Collapsed" 16 HorizontalAlignment="Center" 17 Width="720" 18 Margin="0,0,0,10" 19 AlternationCount="2" 20 CanUserAddRows="True"> 21 <DataGrid.Columns> 22 ↓グリッド上のこの列に配置したUserControl「B」内で例外「BindingExpression」が発生。 23 <DataGridTemplateColumn x:Name="ColQuestion" Width="700"> 24 <DataGridTemplateColumn.CellTemplate> 25 <DataTemplate> 26 <local:B 27 x:Name="ucB" 28 ItemsSource="{Binding Info}" /> 29 </DataTemplate> 30 </DataGridTemplateColumn.CellTemplate> 31 </DataGridTemplateColumn> 32 </DataGrid.Columns> 33 </DataGrid> 3435 </UserControl>

c#

1カラムに配置したユーザコントロールソース 2 34 #region "Constractor" 5 public UcInterviewListRow() 6 { 7 InitializeComponent(); 8 9 this.DataContext = this; 10 11 } 12 13 #endregion 14 15 #region "依存プロパティ" 16 public static readonly DependencyProperty ItemsSourceProperty = 17 DependencyProperty.Register("ItemsSource", 18 typeof(InterviewListInfo), 19 typeof(UcInterviewListRow), 20 new FrameworkPropertyMetadata( 21 null, 22 FrameworkPropertyMetadataOptions.BindsTwoWayByDefault, 23 new PropertyChangedCallback(OnItemsSourceChanged) 24 ) 25 ); 26 2728 29 #endregion 30 31 #region "CLI用プロパティ" 32 public InterviewListInfo ItemsSource 33 { 34 get { return (InterviewListInfo)GetValue(ItemsSourceProperty); } 35 set { SetValue(ItemsSourceProperty, value); } 36 } 37 3839 40 #endregion 41 42 protected override void OnPropertyChanged(DependencyPropertyChangedEventArgs e) 43 { 44 base.OnPropertyChanged(e); 45 46 ↓デバッグロジック(例外「BindingExpression」をキャッチ) 47 Debug.WriteLine(e.Property.Name); 48 } 49 5051 } 52

###試したこと
DataGridを配置したユーザコントロールソースに以下のようにdebugカラムを追加して例外が発生しているInfoプロパティを追加して画面表示をさせてみた処、クラス名は表示されました。

↓グリッド上のこの列にはバインドした「Info」のクラス名が表示される。 <DataGridTextColumn x:Name="ColInfo" Header="Info" Binding="{Binding Info}" Width="400" />

又、同じようなケースを簡易的に実装するテストプログラムを作成して実行すると同じ例外は発生せず各セルに表示されたユーザコントロールは行データに応じて表示されました。

###補足情報(言語/FW/ツール等のバージョンなど)
言語:C#
Fw:.Net 4.5.2

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

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

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

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

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

hihijiji

2017/07/31 10:10

VM など記載されてない部分の凡ミスに一票。
kinkin334

2017/07/31 18:45

VM側のソースは関係ないと考えています。理由はDataGridにセットしたListの行バインドクラスのプロパティ値(Info)は試した事に記載したデバッグ列で参照が出来ています。しかし、DataGrid上に配置したUserControlのItemSourceに同じようにバインドを記述していますが、UserControl側のOnPropertyChangedイベントでエラーになってしまいます。
guest

回答1

0

ベストアンサー

コンストラクタで

C#

1this.DataContext = this

してるからでは?

自身をDataContext に設定しているから、Infoが見つからないと怒られているようにみえますが。

投稿2017/08/02 05:49

ebiryo

総合スコア797

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

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

kinkin334

2017/08/02 06:27

ご指摘の通りでした。 解決しました。 ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問