【问题标题】:WPF GridViewColumn.CellTemplate DataTemplate ContentPresenterWPF GridViewColumn.CellTemplate DataTemplate ContentPresenter
【发布时间】:2017-10-27 10:13:47
【问题描述】:

我有一个使用 DataTemplates 的 ListView。如果我在 ListView 中使用它定义了 XAML 上的列,它应该如何工作。在我看来,我的 DataTemplates 被使用。但是,如果我想在第二个 ListView 中使用相同的 DataTemplate,我将新列添加到 ListView,它不会使用我的 DataTemplate。我该怎么办?

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

<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 添加到我的动态列???

【问题讨论】:

    标签: wpf datatemplate datagridviewcolumn contentpresenter


    【解决方案1】:

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

    以下属性都用于定义内容和样式 列单元格,并在此处按优先顺序列出, 从高到低: - 显示成员绑定 - 细胞模板 - 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 );
    

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

    【讨论】:

    • 感谢您的回答。这是正确的。为此,我使用了 2 个 ListViews 进行测试。我使用来自 XAML 的绑定并且它工作的那个。另一个 ListView 在运行时设计列,这不能正常工作。它只生成一个带有“.ToString()”内容的文本框。但我想在动态文本框中也使用我的 DataTemplate。不是默认的文本框。那么如何在代码中设置呢?
    • 您可以使用 xamlReader 动态编译每列的数据模板。我将其添加到答案中。
    • 非常感谢德米特里。还有其他问题需要解决。因此,正如预期的那样花费了更多时间。但它就像我现在想要的那样工作。 XamlReader.Load 的提示对我来说是关键。我不知道这种将 XAML 实现到代码中的方法。
    猜你喜欢
    • 2018-04-26
    • 1970-01-01
    • 1970-01-01
    • 2014-08-25
    • 2012-08-11
    • 2016-04-25
    • 2015-07-25
    • 2011-05-13
    • 1970-01-01
    相关资源
    最近更新 更多