【问题标题】:Overriding DataGridTextColumn覆盖 DataGridTextColumn
【发布时间】:2011-11-06 18:41:46
【问题描述】:

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

问题是文本框在添加到网格时会丢失其绑定。也就是说,对其 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 工具包

【问题讨论】:

    标签: wpf data-binding datagrid wpftoolkit


    【解决方案1】:

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

    从基类中获取 TextBox 后,像这样设置它的绑定:

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

    无论如何这对我有用。

    注意,我不确定为什么这行得通,因为阅读 GenerateEditingCell 的文档对我来说意味着您从基类中获取的 TextBox 应该已经正确设置了绑定.不过上面的做法是他们做的in this blog post。

    编辑:

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

    【讨论】:

    • 感谢您查看此@markmuetz。似乎仍然不适合我。显然发生了一些我不完全理解的事情
    • 再次感谢您的帮助。我最终发现了问题并回答了我自己的问题(希望这不是严重违反礼仪)
    • 嘿,一点也不,你得到了答案,这很重要,对吧?
    【解决方案2】:

    原来你还需要重写 PrepareCellForEdit、CommitCellEdit 和 CancelCellEdit

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

    【讨论】:

      猜你喜欢
      • 2023-03-14
      • 2011-06-11
      • 2012-01-28
      • 2012-02-16
      • 1970-01-01
      • 1970-01-01
      • 2021-06-26
      • 2020-06-06
      • 2011-01-23
      相关资源
      最近更新 更多