WPF 控件模板和数据模板
WPF ControlTemplate AND DataTemplate
我有 ListView
,我想对其项目应用自定义 ControlTemplate
。它是这样定义的:
<ListView ItemsSource="{Binding MyAwesomeItems}" ...
MyAwesomeItems 持有不同的 类。所以我心想:"Well, hello DataTemplates."
为了让包含的项目看起来像我想要的那样,我定义了一个 ControlTemplate
这样的:
<ListView.ItemContainerStyle>
<Style TargetType="ListViewItem">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="ListViewItem">
<Border><ContentControl Content="{TemplateBinding Content}"/></Border>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</ListView.ItemContainerStyle>
我使用了 ContentControl
绑定到 TemplateBinding Content
。我预计 WPF 然后会使用我为其定义的任何 DataTemplate 将我的项目插入到 ContentControl
中。
但是,WPF 似乎只使用项目 .ToString()
而没有应用任何 DataTemplates。这是有意为之的行为吗?
我想要实现的是:有一个 项目列表 ,其中每个项目的 容器 看起来完全符合我的要求并且该容器的 content 来自 DataTemplate。
在 ControlTemplate
中,对于 ContentControl
,您通常使用空的 ContentPresenter
标签。你的情况:
<ControlTemplate TargetType="ListViewItem">
<Border>
<ContentPresenter/>
</Border>
</ControlTemplate>
ContentPresenter
有一个 ContentSource
属性,默认为 "Content" 并设置所有必要的属性(Content
、ContentTemplate
、等)。
详情见here。
我有 ListView
,我想对其项目应用自定义 ControlTemplate
。它是这样定义的:
<ListView ItemsSource="{Binding MyAwesomeItems}" ...
MyAwesomeItems 持有不同的 类。所以我心想:"Well, hello DataTemplates."
为了让包含的项目看起来像我想要的那样,我定义了一个 ControlTemplate
这样的:
<ListView.ItemContainerStyle>
<Style TargetType="ListViewItem">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="ListViewItem">
<Border><ContentControl Content="{TemplateBinding Content}"/></Border>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</ListView.ItemContainerStyle>
我使用了 ContentControl
绑定到 TemplateBinding Content
。我预计 WPF 然后会使用我为其定义的任何 DataTemplate 将我的项目插入到 ContentControl
中。
但是,WPF 似乎只使用项目 .ToString()
而没有应用任何 DataTemplates。这是有意为之的行为吗?
我想要实现的是:有一个 项目列表 ,其中每个项目的 容器 看起来完全符合我的要求并且该容器的 content 来自 DataTemplate。
在 ControlTemplate
中,对于 ContentControl
,您通常使用空的 ContentPresenter
标签。你的情况:
<ControlTemplate TargetType="ListViewItem">
<Border>
<ContentPresenter/>
</Border>
</ControlTemplate>
ContentPresenter
有一个 ContentSource
属性,默认为 "Content" 并设置所有必要的属性(Content
、ContentTemplate
、等)。
详情见here。