Member 13725613 Ответов: 0

[C#] WPF checkbox treeview с templateselector


Всем привет,

с некоторых пор я использую TreeViews с флажками в WPF.
Я нашел хорошее решение здесь на этой странице:
tps://www.codeproject.com/Articles/28306/Working-with-Checkboxes-in-the-WPF-TreeView


Однако у меня есть проблемы с тем, чтобы правильно ввести TemplateSelector в этот код.
Я просто хочу отметить линии разными цветами, и для этого я хочу использовать селектор шаблонов. В моем решении он использует шаблон из селектора шаблонов, но он больше не показывает все элементы, только первые 3 подэлемента:

Что я уже пробовал:

<Window 
  x:Class="TreeViewWithCheckBoxes.Window1"
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  xmlns:local="clr-namespace:TreeViewWithCheckBoxes"
  xmlns:dw="clr-namespace:DrWPF.Windows.Controls"
  FontSize="13"
  Title="TreeView with CheckBoxes"
  Width="671.601" Height="343.504" 
  WindowStartupLocation="CenterScreen"  
  >
    <Window.Resources>
        <ResourceDictionary>
            <Style x:Key="TreeViewItemStyle" TargetType="TreeViewItem">
                <Setter Property="IsExpanded" Value="True" />
                <Setter Property="IsSelected" Value="{Binding IsInitiallySelected, Mode=OneTime}" />
                <Setter Property="KeyboardNavigation.AcceptsReturn" Value="True" />
            </Style>
            <DataTemplate x:Key="labelTemplate1">
                <StackPanel Orientation="Horizontal" >
                    <CheckBox Focusable="False" IsChecked="{Binding IsChecked}" VerticalAlignment="Center"/>
                    <TextBlock Text="{Binding Path=Name, Mode=OneWay}" Foreground="Red" Width="Auto" TextWrapping="Wrap"></TextBlock>
                </StackPanel>
            </DataTemplate>
            <DataTemplate x:Key="labelTemplate2">
                <StackPanel Orientation="Horizontal">
                    <!-- These elements are bound to a FooViewModel object. -->
                    <Image Source="doc.png" Margin="10,0,0,0" Width="12"/>
                    <CheckBox Focusable="False" IsChecked="{Binding IsChecked}" VerticalAlignment="Center"/>
                    <TextBlock Text="{Binding Path=Name, Mode=OneWay}" Foreground="Blue" Width="Auto" TextWrapping="Wrap"></TextBlock>
                </StackPanel>
            </DataTemplate>
            <local:LabelTemplateSelector x:Key="labelTemplateSelector" LabelTemplate1="{StaticResource labelTemplate1}" LabelTemplate2 ="{StaticResource labelTemplate2}"/>
            <HierarchicalDataTemplate x:Key="CheckBoxItemTemplate" ItemsSource="{Binding Children, Mode=OneTime}" ItemTemplateSelector="{StaticResource labelTemplateSelector}">
            </HierarchicalDataTemplate>
        </ResourceDictionary>
    </Window.Resources>
    <Window.DataContext>
        <ObjectDataProvider MethodName="CreateFoos" ObjectType="{x:Type local:FooViewModel}" />
    </Window.DataContext>
    <Grid Margin="0,0,0,-0.906">
        <Grid Height="233.746" VerticalAlignment="Top">
            <TreeView x:Name="tree" ItemContainerStyle="{StaticResource TreeViewItemStyle}" ItemsSource="{Binding Mode=Default}" ItemTemplate="{StaticResource CheckBoxItemTemplate}"/>
        </Grid>
    </Grid>
</Window>

Dirk Bahle

На этот вопрос нельзя ответить, если вы не покажете хотя бы код для шаблона seletor.

Вы пробовали установить точку останова в методе выбора шаблона LabelTemplateSelector? Что там происходит? Может ли быть так, что селектор шаблонов возвращает null при некоторых условиях?

0 Ответов