LoginSignup
1
2

More than 5 years have passed since last update.

DataGridTemplateColumn内のコントロールにコードビハインドからアクセスする-其の2-

Last updated at Posted at 2016-08-26

前回

DataGridTemplateColumn内のコントロールにコードビハインドからアクセスする-其の1-の続き。

やりたいこと

コードビハインドからDataGridTemplateColumn内のコントロールにアクセスする。
UserControl内のDataGridにバインドする。各項目にバインドするPathは外部から設定したい。

駄目だった

CellTemplate.LoadContent()を利用してDataTemplate内のコントロールにアクセスするところまではできた。
けど、どうもLoadContent()の戻り値は新しくインスタンス化されたものらしく、プロパティを変更しても
元オブジェクトの値に反映されない。

C#
var templateColumn = ZeroDataGrid.Columns[0] as DataGridTemplateColumn;
var checkBox = templateColumn.CellTemplate.LoadContent() as CheckBox;
checkBox.FontSiZe = 50; // これが反映されない

じゃどうしようか

外部からバインドするプロパティ名を設定する方法を諦め、
UserControl内のDataGridにバインドするデータクラスを固定にする。
いや、これなんで思いつかなかったんやろうorz

C#
// ***データクラス***
public class ListData
{
  public string Name {get; set;}
}
C#
// ***UserControl内XAML***
<DataGrid Name="MainDataGrid">
  <DataGrid.Columns>
    <DataGridTextColumn Binding="{Binding Path=Name}"/>
  </DataGrid.Columns>
</DataGrid>
C#
// ***UserControl内コードビハインド***
// 外部からDataGridにバインドするデータを受け取る用
public static readonly DependencyProperty ListDataProperty = DependencyProperty.Register(
    "ListData",
    typeof(ObservableCollection<ListData>),
    typeof(HogeUserControl ),
    new FrameworkPropertyMetadata(null)
);
public ObservableCollection<ZeroCheckListBoxViewData.ListData> ListData
{
    get { return (ObservableCollection<ListData>)base.GetValue(ListDataProperty); }
    set { base.SetValue(ListDataProperty, value); }
}

// ロードイベントなりなんなり好きなところで
mainDataGrid.ItemsSource = this.ListData;

あとは、UserControl貼ってるXAMLで

C#
<c:HogeUserControl ListData="{Binding Path=DataList}"/>
// DataListは「ObservableCollection<ListData> DataList」こんな感じで宣言

とりあえず、これでやりたいことはできたよorz

1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2