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 );
我没有运行代码可能会有小错误。
我有一个使用 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 );
我没有运行代码可能会有小错误。