【问题标题】:Custom DataGrid column with a CellTemplate and binding具有 CellTemplate 和绑定的自定义 DataGrid 列
【发布时间】:2010-08-17 11:17:57
【问题描述】:

我需要使用自定义 CellTemplate 创建一个可重用的 DataGrid 列。除其他外,此 CellTemplate 应该包含一个 TextBlock 控件,我需要将值绑定到该控件以在 DataGrid 中显示。到目前为止,我看到的所有示例都在 DataGrid 的 Columns 属性中直接为列指定了 CellTemplate,并且还直接指定了与 TextBlock 的绑定,例如:

<data:DataGrid>
    <data:DataGrid.Columns>
        <data:DataGridTemplateColumn Header="Name">
            <data:DataGridTemplateColumn.CellTemplate>
                <DataTemplate>
                    <TextBlock Text="{Binding Name}"/>
                </DataTemplate>
            </data:DataGridTemplateColumn.CellTemplate>
        </data:DataGridTemplateColumn>
    </data:DataGrid.Columns>
</data:DataGrid>

我需要将此列封装到一个单一的、可重用的控件中,并且我想为它指定一个绑定,就像为一个普通的 DataGridTextColumn 一样。换句话说,当使用这个自定义列时,我只想写这样的东西:

<data:DataGrid>
    <data:DataGrid.Columns>
        <controls:CustomColumn Header="Name" Binding="{Binding Name}" />
    </data:DataGrid.Columns>
</data:DataGrid>

问题是我的自定义列继承自的 DataGridTemplateColumn 没有 Binding 属性。我以为我可以使用 DataGridBoundColumn,但无法为其指定 CellTemplate。

如何实现期望的行为?谢谢!

【问题讨论】:

    标签: silverlight datagrid binding datagridtemplatecolumn


    【解决方案1】:

    这个问题已经很老了,但我最近自己也遇到了这个问题。上面@Gregfr 答案的替代方法是编写您的自定义 DataGridColumn 类。以下是我为 DatePicker Column 所做的:

     public class DataGridDatePickerColumn : DataGridBoundColumn
      {
        protected override FrameworkElement GenerateEditingElement(DataGridCell cell, object dataItem)
        {
          var datePicker = new DatePicker();
          datePicker.SetBinding(DatePicker.TextProperty, this.Binding);
          datePicker.SetBinding(DatePicker.SelectedDateProperty, this.Binding);
          return datePicker;
        }
    
        protected override FrameworkElement GenerateElement(DataGridCell cell, object dataItem)
        {
          var textBlock = new TextBlock();
          textBlock.SetBinding(TextBlock.TextProperty, this.Binding);
          return textBlock;
        }
      }
    

    然后我在我的 xaml 页面中的单行调用中使用它,如下所示:

    <h:DataGridDatePickerColumn IsReadOnly="False" Header="Some Date" Binding="{Binding SomeDate, StringFormat='dd.MM.yyyy'}" />
    

    您的情况中,您可以通过编写支持 PreviewTextInput 属性的支持函数并使用 [0-9]+ 等正则表达式来控制编辑来扩展此 C# 类。

    【讨论】:

      【解决方案2】:

      我认为最简单的做法是创建一个自定义控件,然后像这样使用它:

                  <DataGridTemplateColumn>
                      <DataGridTemplateColumn.CellTemplate>
                          <DataTemplate>
                              <controls:CustomColumn Header="Name" Binding="{Binding Name}" />
                          </DataTemplate>
                      </DataGridTemplateColumn.CellTemplate>
                  </DataGridTemplateColumn>
      

      我昨天做了类似的事情,效果很好

      【讨论】:

        猜你喜欢
        • 2021-12-30
        • 1970-01-01
        • 1970-01-01
        • 2012-04-01
        • 2014-08-13
        • 2011-01-12
        • 1970-01-01
        • 2010-10-24
        • 2014-05-31
        相关资源
        最近更新 更多