10

後でより複雑なデータ列に移動するために、独自のチェックボックス列を作成しようとしています (デフォルトのものを置き換えます)。次のコードがあります。

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 で使用される唯一のメソッドMyCheckBoxColumnGenerateElement(). 他のすべての方法は使用されません。それらにブレークポイントを設定しましたが、ヒットすることはありません...
  • をデータ ソースとして使用しObservableCollectionていますが、残りの列は変更されたときに通知しますが、これは通知しません。

奇妙なことにbool、チェックボックスをオン/オフにすると値が変更されますが、通知もパスも通過しませんCommitCellEdit()。ここで何がうまくいかないのか誰か知っていますか?

編集 :

TextBlock内部からa を返すとGenerateElement()、他のメソッドが呼び出されるようです (ただし、通知の問題は修正されません)。しかし、これが CheckBox で機能しないのはなぜでしょうか? デフォルトのチェックボックス列はどのように機能しますか???

4

1 に答える 1