首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ControlTemplate在运行时不使用ContentTemplateSelector

ControlTemplate在运行时不使用ContentTemplateSelector
EN

Stack Overflow用户
提问于 2015-07-16 13:49:42
回答 1查看 1.2K关注 0票数 0

我有一个自定义控件CheckableItemsControl,它没有外观,没有自己的依赖属性,只是从ItemsControl派生出来。

根据瑞秋在这个问题中的回答:How can I overwrite my ListBox's ItemTemplate and still keep the DisplayMemberPath?,我在Generic.xaml中找到了如下的风格:

代码语言:javascript
复制
<Style x:Key="{x:Type controls:CheckableItemsControl}" TargetType="{x:Type controls:CheckableItemsControl}"
       BasedOn="{StaticResource {x:Type ItemsControl}}">
    <Setter Property="ItemTemplate">
        <Setter.Value>
            <DataTemplate>
                <CheckBox IsChecked="{Binding IsChecked}" Content="{TemplateBinding ContentPresenter.Content}" 
                          ContentTemplateSelector="{TemplateBinding ContentPresenter.ContentTemplateSelector}"
                          Margin="5" />
            </DataTemplate>
        </Setter.Value>
    </Setter>
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type controls:CheckableItemsControl}">
                <Grid>
                    <Grid.RowDefinitions>
                        <RowDefinition Height="Auto" />
                        <RowDefinition />
                    </Grid.RowDefinitions>

                    <StackPanel Orientation="Horizontal" HorizontalAlignment="Right" VerticalAlignment="Bottom"
                                Grid.Row="0"
                                Margin="0,0,0,3">
                        <Button x:Name="PART_SelectAllButton" Content="Select All" Width="60" Margin="5,0,5,0" />
                        <Button x:Name="PART_InvertButton" Content="Invert" Width="60" Margin="5,0,5,0" />
                    </StackPanel>

                    <Border Grid.Row="1" BorderBrush="{x:Static SystemColors.ActiveBorderBrush}" BorderThickness="1">
                        <ScrollViewer VerticalScrollBarVisibility="Auto" HorizontalScrollBarVisibility="Auto">
                            <ItemsPresenter />
                        </ScrollViewer>
                    </Border>
                </Grid>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

使用它是这样的:

代码语言:javascript
复制
<controls:CheckableItemsControl ItemsSource="{Binding Reports}" DisplayMemberPath="ReportName" />

现在,这在设计时工作得很好,设计人员正确地呈现项目,并将其ReportName显示为文本。

但是,在运行时,它只呈现类型名称,就像您期望的那样,没有内容模板。

我不明白为什么这会在运行时失败。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-07-16 14:02:07

发现原因是这样的:

wpf debug error output System.WIndows.Data Error 25

最终,ContentTemplateSelector被忽略了,因为我已经通过使用DisplayMemberPath隐式地采用了ContentTemplate

解决方案可能是添加一个自定义依赖项属性来手动提取该值。

进一步信息

来自MSDN上的ContentControl.ContentTemplateSelector Property页面:

如果同时设置了ContentTemplateSelectorContentTemplate属性,则忽略此属性。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31456145

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档