WPF GridViewColumn.CellTemplate DataTemplate ContentPresenter

WPF GridViewColumn.CellTemplate DataTemplate 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 添加到我的动态栏???

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

The following properties are all used to define the content and style of a column cell, and are listed here in their order of precedence, from highest to lowest: - DisplayMemberBinding - CellTemplate - CellTemplateSelector

如果您使用绑定,那么它将生成一个带有绑定对象的“.ToString()”的文本框。如果您了解 ListView 中项目的结构,则只需在其中制作具有适当绑定的 DataTemplates。但是,当动态生成列时,这是一个问题。

您可以为您的列动态生成数据模板并在其中集成绑定:

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 );

我没有运行代码可能会有小错误。