Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Wpf 重写DataGridTextColumn_Wpf_Data Binding_Datagrid_Wpftoolkit - Fatal编程技术网

Wpf 重写DataGridTextColumn

Wpf 重写DataGridTextColumn,wpf,data-binding,datagrid,wpftoolkit,Wpf,Data Binding,Datagrid,Wpftoolkit,我试图提供一个DataGrid列,其行为类似于DataGridTextColumn,但在编辑模式下有一个附加按钮。我查看了DataGridTemplateColumn,但似乎更容易将DataGridTextColumn子类化,如下所示 问题是文本框添加到网格时会丢失其绑定。也就是说,对其文本属性的更改不会反映在非编辑文本块或基础视图模式中 你有没有想过为什么会这样,以及我如何解决这个问题 public class DataGridFileColumn : DataGridTextColumn {

我试图提供一个DataGrid列,其行为类似于DataGridTextColumn,但在编辑模式下有一个附加按钮。我查看了DataGridTemplateColumn,但似乎更容易将DataGridTextColumn子类化,如下所示

问题是文本框添加到网格时会丢失其绑定。也就是说,对其文本属性的更改不会反映在非编辑文本块或基础视图模式中

你有没有想过为什么会这样,以及我如何解决这个问题

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工具包,我认为您必须在GenerateEditingElement(…)方法中手动设置绑定

从基类获取TextBox后,按如下方式设置其绑定:

textBox.DataContext = dataItem;
textBox.SetBinding(TextBlock.TextProperty, Binding);
不管怎么说,这对我很有用

注意,我不知道为什么会这样,因为阅读的文档对我来说意味着从基类获取的文本框应该已经正确设置了绑定。然而,上述方法正是他们所做的

编辑:


您实际上不需要设置绑定,它已经完成了(如文档中所述)。不过,您确实需要设置DataContext,因为出于某种原因,它没有设置在从基类返回的文本框上。

事实证明,您还需要覆盖PrepareCellForEdit、CommitCellEdit和CancellEdit


基类假定(并非不合理地)传入的FrameworkElement将是一个文本框

,感谢您查看@markmuetz。似乎还是不适合我。显然发生了一些我不完全理解的事情再次感谢你的帮助。最后我发现了问题并回答了我自己的问题(希望这不是一个严重违反礼仪的行为)嘿,一点也不,你找到了答案,这才是最重要的,对吗?