###前提・実現したいこと
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 { 10 略 11 }
xaml
1DataGridを配置したユーザコントロールソース 2 <UserControl 3 略 4 <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> 34 略 35 </UserControl>
c#
1カラムに配置したユーザコントロールソース 2 3 略 4 #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 27 略 28 29 #endregion 30 31 #region "CLI用プロパティ" 32 public InterviewListInfo ItemsSource 33 { 34 get { return (InterviewListInfo)GetValue(ItemsSourceProperty); } 35 set { SetValue(ItemsSourceProperty, value); } 36 } 37 38 略 39 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 50 略 51 } 52
###試したこと
DataGridを配置したユーザコントロールソースに以下のようにdebugカラムを追加して例外が発生しているInfoプロパティを追加して画面表示をさせてみた処、クラス名は表示されました。
↓グリッド上のこの列にはバインドした「Info」のクラス名が表示される。 <DataGridTextColumn x:Name="ColInfo" Header="Info" Binding="{Binding Info}" Width="400" />
又、同じようなケースを簡易的に実装するテストプログラムを作成して実行すると同じ例外は発生せず各セルに表示されたユーザコントロールは行データに応じて表示されました。
###補足情報(言語/FW/ツール等のバージョンなど)
言語:C#
Fw:.Net 4.5.2
回答1件
あなたの回答
tips
プレビュー