前回
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