覆盖DataGridTextColumn

时间:2011-08-30 12:36:33

标签: wpf data-binding datagrid wpftoolkit

我正在尝试提供一个DataGrid列,其行为类似于DataGridTextColumn,但在编辑模式下有一个额外的按钮。我查看了DataGridTemplateColumn,但似乎更容易将DataGridTextColumn子类化如下

问题是textBox在添加到网格时失去了绑定。也就是说,对Text属性的更改不会反映在非编辑TextBlock或底层视图模式

对于为什么会出现这种情况以及如何解决这个问题的想法?

public class DataGridFileColumn : DataGridTextColumn
{
    protected override FrameworkElement GenerateEditingElement(DataGridCell cell, object dataItem)
    {
        TextBox textBox = (TextBox)base.GenerateEditingElement(cell, dataItem);

        Button button = new Button { Content = "..." };
        Grid.SetColumn(button, 1);

        return new Grid
        {
            ColumnDefinitions = {
                new ColumnDefinition(),
                new ColumnDefinition { Width = GridLength.Auto },
            },
            Children = {
                textBox,
                button,
            },
        };
    }
}

我正在使用.NET 3.5和WPF工具包

2 个答案:

答案 0 :(得分:2)

事实证明你还需要覆盖PrepareCellForEdit,CommitCellEdit和CancelCellEdit

基类假定(并非不合理地)传入的FrameworkElement将是TextBox

答案 1 :(得分:0)

我认为您必须在GenerateEditingElement(...)方法中手动设置绑定。

一旦你从基类中获取了TextBox,就像这样设置它的绑定:

textBox.DataContext = dataItem;
textBox.SetBinding(TextBlock.TextProperty, Binding);

无论如何,这对我有用。

注意,我不确定为什么这是有效的,因为阅读GenerateEditingCell的文档意味着我从基类中获取的TextBox应该已经设置了它的绑定正确的。但是,上述方法就是他们所做的in this blog post

编辑:

您实际上并不需要设置绑定,它已经完成(正如文档中所述)。您确实需要设置DataContext,因为某些原因,这不是在从基类返回的textBox上设置的。