列表框模板与各种类型的控件

时间:2015-03-08 02:57:59

标签: wpf xaml

我尝试修改现有的WPF win应用,以便表示过滤器的复选框列表有时也包含滑块控件子节点。它现在是复选框。

这就是我想要的。目前,它看起来就像这样但没有滑块。

(更新看起来更清楚)

TREE CONTROL
> Node 1
> > [X] Node 1.1
> Node 2
> > [X] Node 2.1
> Node 3
> > [X] Node 3.1
> > [X] Node 3.2
> Node 4
> > |-------| Slider
> Node 5
> > Node 5.1 
> > > [X] Node 5.1.1
> > > [X] Node 5.1.2
> > Node 5.2 
> > > [X] Node 5.2.1
> > > [X] Node 5.2.2
> Node 6
> > [X] Node 6.1
> > [X] Node 6.2
> > [X] Node 6.3
> Node 7
> > |------| Slider

基本列表是一个可观察的集合。它目前只有一个List Children属性,它与模板选择器绑定以获得不同的深度。

我想我必须让列表框更直接地绑定到过滤器对象而不是过滤器子列表。

新的各种过滤器对象可能有也可能没有列表或其他属性来驱动滑块。

有一个c#模板选择器,但它在Children列表而不是过滤器列表上运行。它可以获得儿童节点的各种深度

我可以根据需要更改集合和对象。

有什么建议吗?我在js和html中做过这种类型的东西,但我是WPF和xmal的菜鸟。

谢谢!

这很接近,但是在我不想要的主要关卡上放置一个复选框。我只想要那些应该有复选框的最低级别的复选框。

<DockPanel.Resources>

<HierarchicalDataTemplate x:Key="Other">
                <StackPanel Orientation="Horizontal">
                    <CheckBox IsChecked="{Binding Path=IsChecked }"
                                                  Padding="0 0 5 0" 
                                                  x:Name="itemChecked"/>
                    <TextBlock Text="{Binding Name}" TextTrimming="CharacterEllipsis" />
                </StackPanel>
            </HierarchicalDataTemplate>

            <!-- hasChildrenTemplate -->
            <HierarchicalDataTemplate x:Key="HasChildren" 
                                      ItemsSource="{Binding Children}">

                <TextBlock Text="{Binding Name}" />

                <HierarchicalDataTemplate.ItemTemplate>
                    <DataTemplate>
                        <StackPanel Orientation="Horizontal">
                            <CheckBox IsChecked="{Binding Path=IsChecked }"
                                                  Padding="0 0 5 0" 
                                                  x:Name="itemChecked"/>
                            <TextBlock Text="{Binding Name}" />
                        </StackPanel>
                    </DataTemplate>
                </HierarchicalDataTemplate.ItemTemplate>

            </HierarchicalDataTemplate>

            <HierarchicalDataTemplate x:Key="Slider">
                <Slider Width="100"
                        TickPlacement="BottomRight"
                        Value="{Binding Value}"
                        Minimum="{Binding Min}"
                        Maximum="{Binding Max}"/>

            </HierarchicalDataTemplate>

            <!-- noChildrenTemplate -->
            <HierarchicalDataTemplate x:Key="NoChildren" ItemsSource="{Binding Children}">
                <StackPanel Orientation="Horizontal">
                    <CheckBox IsChecked="{Binding Path=IsChecked }"
                                                  Padding="0 0 5 0" 
                                                  x:Name="itemChecked"/>
                    <TextBlock Text="{Binding Name}" />
                </StackPanel>
            </HierarchicalDataTemplate>

            <!-- template selector for filter list -->
            <src:FilterTemplateSelector x:Key="FilterTemplateSelector"
                                            HasChildren="{StaticResource HasChildren}"
                                            NoChildren="{StaticResource NoChildren}" 
                                            Slider="{StaticResource Slider}" 
                                            Other="{StaticResource Other}"/>
                    </DockPanel.Resources>

        <TreeView x:Name="uiFilterTreeView2" 
                          Width="250"
                          ItemsSource="{Binding Path=Filters}"
                          BorderThickness="1,1,1,0"
                          ScrollViewer.HorizontalScrollBarVisibility="Disabled" 
                          ItemTemplateSelector="{StaticResource FilterTemplateSelector}">
        </TreeView>

1 个答案:

答案 0 :(得分:1)

我通过确保每个主节点都有一个集合来实现它。滑块是单个子节点。

                                                                             

    <!-- hasChildrenTemplate -->
    <HierarchicalDataTemplate x:Key="HasChildren" 
                              ItemsSource="{Binding Children}">

        <TextBlock Text="{Binding Name}" 
                   />

        <HierarchicalDataTemplate.ItemTemplate>
            <DataTemplate>
                <StackPanel Orientation="Horizontal">
                    <CheckBox IsChecked="{Binding Path=IsChecked }"
                                          Padding="0 0 5 0" 
                                          x:Name="itemChecked"/>
                    <TextBlock Text="{Binding Name}" />
                </StackPanel>
            </DataTemplate>
        </HierarchicalDataTemplate.ItemTemplate>

    </HierarchicalDataTemplate>

    <!-- noChildrenTemplate -->
    <HierarchicalDataTemplate x:Key="NoChildren">
        <StackPanel Orientation="Horizontal">
            <CheckBox IsChecked="{Binding Path=IsChecked }"
                                          Padding="0 0 5 0" 
                                          x:Name="itemChecked"/>
            <TextBlock Text="{Binding Name}" />
        </StackPanel>
    </HierarchicalDataTemplate>

    <HierarchicalDataTemplate x:Key="Slider">
        <StackPanel Orientation="Horizontal">
            <!--<TextBlock Text="{Binding Name}" />-->

            <Slider Width="100"
                    HorizontalAlignment="Right"
                TickPlacement="BottomRight"
                Value="{Binding Value}"
                Minimum="{Binding Min}"
                Maximum="{Binding Max}"/>
        </StackPanel>
    </HierarchicalDataTemplate>

    <!-- template selector for location filter list -->
    <local:FilterTemplateSelector x:Key="FilterTemplateSelector"
                                    HasChildren="{StaticResource HasChildren}"
                                    Slider="{StaticResource Slider}"
                                    NoChildren="{StaticResource NoChildren}" 
                                    Dma="{StaticResource Other}"/>

    <!-- location filter template  -->
    <HierarchicalDataTemplate x:Key="filterTemplate"
                              ItemsSource="{Binding Children}"
                              ItemTemplateSelector="{StaticResource FilterTemplateSelector}">

        <TextBlock Text="{Binding Name}" 
                   />
    </HierarchicalDataTemplate>




</DockPanel.Resources>

<TreeView x:Name="uiFilterTreeView" 
                  Width="250"
                  ItemsSource="{Binding Path=Filters}"
                  BorderThickness="1,1,1,0"
                  ScrollViewer.HorizontalScrollBarVisibility="Disabled" 
                  ItemTemplate="{StaticResource filterTemplate }"/>