簡體   English   中英

ControlTemplate在運行時不使用ContentTemplateSelector

[英]ControlTemplate not using ContentTemplateSelector at runtime

我有一個自定義控件CheckableItemsControl ,我將它組合在一起,它看起來很簡單,沒有自己的依賴項屬性,而只是從ItemsControl派生的。

遵循雷切爾(Rachel)在這個問題上的回答: 如何覆蓋列表框的ItemTemplate並仍然保留DisplayMemberPath? 我設法在Generic.xaml中提出了以下樣式:

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

並使用它是這樣的:

<controls:CheckableItemsControl ItemsSource="{Binding Reports}" DisplayMemberPath="ReportName" />

現在,這在設計時就可以正常工作,設計人員可以正確地渲染項目,並且將其ReportName顯示為文本。

但是,在運行時,它只呈現您所期望的類型名稱,而沒有內容模板。

我無法弄清楚為什么這會在運行時失敗。

發現原因在於:

wpf調試錯誤輸出System.WIndows.Data錯誤25

最終, ContentTemplateSelector被忽略了,因為我通過使用DisplayMemberPath隱式采用了ContentTemplate

解決方案可能是添加自定義依賴項屬性,以手動提取該值。

更多信息

從MSDN的ContentControl.ContentTemplateSelector Property頁上:

如果同時設置了ContentTemplateSelectorContentTemplate屬性,則將忽略此屬性。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM