後でより複雑なデータ列に移動するために、独自のチェックボックス列を作成しようとしています (デフォルトのものを置き換えます)。次のコードがあります。
public class MyCheckBoxColumn : DataGridBoundColumn
{
protected override FrameworkElement GenerateElement(DataGridCell cell, object dataItem)
{
var cb = new CheckBox();
var bb = this.Binding as Binding;
var b = new Binding { Path = bb.Path, Source = cell.DataContext };
cb.SetBinding(ToggleButton.IsCheckedProperty, b);
return cb;
}
protected override FrameworkElement GenerateEditingElement(DataGridCell cell, object dataItem)
{
var cb = new CheckBox();
var bb = this.Binding as Binding;
var b = new Binding { Path = bb.Path, Source = ToggleButton.IsCheckedProperty };
cb.SetBinding(ToggleButton.IsCheckedProperty, b);
return cb;
}
protected override object PrepareCellForEdit(FrameworkElement editingElement, RoutedEventArgs editingEventArgs)
{
var cb = editingElement as CheckBox;
return cb.IsChecked;
}
protected override void CancelCellEdit(FrameworkElement editingElement, object uneditedValue)
{
var cb = editingElement as CheckBox;
if (cb != null) cb.IsChecked = (bool)uneditedValue;
}
protected override bool CommitCellEdit(FrameworkElement editingElement)
{
var cb = editingElement as CheckBox;
BindingExpression binding = editingElement.GetBindingExpression(ToggleButton.IsCheckedProperty);
if (binding != null) binding.UpdateSource();
return true;// base.CommitCellEdit(editingElement);
}
}
そして私のカスタム DataGrid:
public class MyDataGrid : DataGrid
{
protected override void OnAutoGeneratingColumn(DataGridAutoGeneratingColumnEventArgs e)
{
try
{
var type = e.PropertyType;
if (type == typeof(bool))
{
var col = new MyCheckBoxColumn();
col.Binding = new Binding(e.PropertyName) {Mode = BindingMode.TwoWay};
e.Column = col;
}
else
{
base.OnAutoGeneratingColumn(e);
}
var propDescr = e.PropertyDescriptor as System.ComponentModel.PropertyDescriptor;
e.Column.Header = propDescr.Description;
}
catch (Exception ex)
{
Utils.ReportException(ex);
}
}
}
これで、次の 2 つの点を除いて、すべてがうまくいっているように見えます。
- in で使用される唯一のメソッド
MyCheckBoxColumn
はGenerateElement()
. 他のすべての方法は使用されません。それらにブレークポイントを設定しましたが、ヒットすることはありません... - をデータ ソースとして使用し
ObservableCollection
ていますが、残りの列は変更されたときに通知しますが、これは通知しません。
奇妙なことにbool
、チェックボックスをオン/オフにすると値が変更されますが、通知もパスも通過しませんCommitCellEdit()
。ここで何がうまくいかないのか誰か知っていますか?
編集 :
TextBlock
内部からa を返すとGenerateElement()
、他のメソッドが呼び出されるようです (ただし、通知の問題は修正されません)。しかし、これが CheckBox で機能しないのはなぜでしょうか? デフォルトのチェックボックス列はどのように機能しますか???