WPF编辑自动生成的列标题文本

时间:2014-04-23 11:32:11

标签: wpf datagridview

我使用WPF DataGrid来显示DataTable' s。 我需要能够编辑这个绑定的DataTables(双向绑定)。

我正在使用DataGrid:

<DataGrid SelectionUnit="CellOrRowHeader" IsReadOnly="False" AutoGenerateColumns="True" ItemsSource="{Binding Path=SelectedItem.BindableContent, FallbackValue={x:Null}}" />

我遇到的问题是,用户无法编辑ColumnHeader的单元格内容或行。 下面的截图说明了这个问题。我唯一能做的就是对列进行排序。 有没有办法编辑列标题,例如当用户点击两次,或者按 F2

也许有些Style&#39;还是HeaderTemplate会做这个工作?我已经尝试了一些我在互联网上找到的样式和控件模板,但没有任何成功。

Editable Cells, but not editable Col Headers

编辑:

我设法在AutogeneratingTextcolumn事件处理程序中的TextBox(而不是TextBlock)中显示列标题:

Column Header Text in TextBox

private void _editor_AutoGeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e) {
  // First: create and add the data template to the parent control
  DataTemplate dt = new DataTemplate(typeof(TextBox));
  e.Column.HeaderTemplate = dt;

  // Second: create and add the text box to the data template
  FrameworkElementFactory txtElement =
      new FrameworkElementFactory(typeof(TextBox));
  dt.VisualTree = txtElement;

  // Create binding
  Binding bind = new Binding();
  bind.Path = new PropertyPath("Text");
  bind.Mode = BindingMode.TwoWay;

  // Third: set the binding in the text box
  txtElement.SetBinding(TextBox.TextProperty, bind);
  txtElement.SetValue(TextBox.TextProperty, e.Column.Header);
}             

但是我无法正确设置绑定,如果我编辑TextBox中的Text,它不会更改Column.Header - Property中的文本(由绑定自动生成)如上所述的DataTable

1 个答案:

答案 0 :(得分:1)

您忘记设置绑定的来源,并且在绑定注册后不得设置该值。正确的代码如下:

private void asdf_AutoGeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e)
    {
        DataTemplate dt = new DataTemplate(typeof(TextBox));
        e.Column.HeaderTemplate = dt;

        FrameworkElementFactory txtElement =
            new FrameworkElementFactory(typeof(TextBox));
        dt.VisualTree = txtElement;

        Binding bind = new Binding();
        bind.Path = new PropertyPath("Header");
        bind.Mode = BindingMode.TwoWay;
        // set source here
        bind.Source = e.Column;

        txtElement.SetBinding(TextBox.TextProperty, bind);
        // You mustn't set the value here, otherwise the binding doesn't work
        // txtElement.SetValue(TextBox.TextProperty, e.Column.Header);
    }

此外,您必须将绑定属性更改为Header,因为您要将绑定添加到TextBox的text属性。