WPF GridViewColumn.CellTemplate DataTemplate ContentPresenter

时间:2017-10-27 10:13:48

标签: wpf datatemplate datagridviewcolumn contentpresenter

我有一个使用DataTemplates的ListView。如果我在ListView中使用它来定义XAML上的列,那么它的工作原理是什么。我的DataTemplates在我的视图中使用。但是,如果我想在第二个ListView中使用相同的DataTemplates,我在其中向ListView添加新列,它不使用我的DataTemplate。我该怎么办?

XAML中第一个ListView的代码如下所示:

<GridViewColumn x:Name="lvSecondColumn" Header="Value" Width="200">
   <GridViewColumn.CellTemplate>
      <DataTemplate>
        <ContentPresenter Content="{Binding}"/>
      </DataTemplate>
  </GridViewColumn.CellTemplate>
</GridViewColumn>

我用于在第二个ListView中生成列的代码是:

DataColumn dc = (DataColumn)colum;

GridViewColumn column = new GridViewColumn( );
column.DisplayMemberBinding = new Binding( dc.ColumnName ) );
column.Header = dc.ColumnName;
TestColumns.Columns.Add( column );

TestListView.ItemsSource = dt.DefaultView; 

在WPFInspector中,我看到动态生成列中没有ContentPresenter。 Picture from missing ContentPresenter from WPFInspector 如何将ContentPresenter添加到我的动态列???

1 个答案:

答案 0 :(得分:1)

您无法同时设置Binding和DataTemplate。根据文件 https://msdn.microsoft.com/en-us/library/system.windows.controls.gridviewcolumn.displaymemberbinding(v=vs.110).aspx

  

以下属性都用于定义内容和样式   列单元格的列表,并按其优先顺序列在此处,   从最高到最低:    - DisplayMemberBinding    - CellTemplate    - CellTemplateSelector

如果您使用绑定,那么它将生成一个带有&#34; .ToString()&#34;的文本框。绑定对象的如果您了解ListView中项目的结构,则可以在其中创建具有适当绑定的DataTemplates。但是,在动态生成列时,这是一个问题。

您可以为列动态生成datatemplate并将绑定集成到其中:

public DataTemplate CreateColumnTemplate(string property)
{
    StringReader stringReader = new StringReader(
    @"<DataTemplate 
        xmlns=""http://schemas.microsoft.com/winfx/2006/xaml/presentation""> 
            <ContentPresenter Content=""{Binding " + property + @"}""/> 
        </DataTemplate>");
    XmlReader xmlReader = XmlReader.Create(stringReader);
    return XamlReader.Load(xmlReader) as DataTemplate;
}

然后您可以像这样生成列:

GridViewColumn column = new GridViewColumn( );
column.CellTemplate = CreateColumnTemplate(dc.ColumnName);
column.Header = dc.ColumnName;
TestColumns.Columns.Add( column );

我没有运行代码,可能没什么错误。