[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 при некоторых условиях?