单击后WPF ComboBox加载元素 [英] WPF ComboBox load elements after click

查看:76
本文介绍了单击后WPF ComboBox加载元素的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个自定义组合框,现在就是这样:

I have a custom combobox, that right now is this way:

<ComboBox 
    x:Name="ComboBoxBtn" 
    VerticalAlignment="Top" 
    HorizontalAlignment="Left" 
    Margin="0,0,0,-1" 
    Width="300" 
    ItemsSource="{Binding Source, RelativeSource={RelativeSource AncestorType=UserControl}}"
    SelectedItem="{Binding Path=Selected, Mode=TwoWay, RelativeSource={RelativeSource AncestorType=UserControl}}"
    IsSynchronizedWithCurrentItem="True">
    <ComboBox.ItemTemplate>
        <DataTemplate>
            <Grid Name="PART_GRID">
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="Auto" />
                    <ColumnDefinition Width="Auto" />
                </Grid.ColumnDefinitions>
                <Label Content="{Binding}"
                   Width="250" />
                <Button Name="PART_BUTTON"
                    Grid.Column="1"
                    Content="+"
                    Command="{Binding AddCommandButton, ElementName=root}"
                    CommandParameter="{Binding}" />
            </Grid>
            <DataTemplate.Triggers>
                <DataTrigger Binding="{Binding Favorite}"
                         Value="True">
                    <Setter TargetName="PART_GRID"
                        Property="Background"
                        Value="#FFE6E6FA" />
                    <Setter TargetName="PART_BUTTON"
                        Property="Content"
                        Value="-" />
                    <Setter TargetName="PART_BUTTON"
                        Property="Command"
                        Value="{Binding RemoveCommandButton, ElementName=root}" />
                </DataTrigger>
            </DataTemplate.Triggers>
        </DataTemplate>
    </ComboBox.ItemTemplate>
</ComboBox>

基本上,我的来源是一个ObservableCollection,其中包含可能是收藏夹的元素,或者不是收藏夹的元素呈现不同的方式。现在,我希望在加载ComboBox时仅加载收藏夹项和最后的全部加载按钮。单击时,会将其余元素加载到我的ComboBox中。

Basically my source is an ObservableCollection, that contains elements that could be Favorite or not, in each case they are presented different way. Right now I want that when the ComboBox is loaded, only loads with the Favorite items and a button "Load All" at the end. When is clicked loads the rest of the elements to my ComboBox.

我不知道如何以不同的方式(仅一个按钮)创建最后一个项目,并且关于其余部分的负载,我想我只能从收藏夹中的收藏夹项开始,然后单击按钮将其余部分添加到列表中。我对吗?

I don't know how I can create the last item in a different way (just a button) and regarding the load the rest part I guess I could start with the Favorite items only in my Collection, then when I click the button I add the rest to my list. Am I right?

推荐答案

编辑组合框的模板(右键单击控件->编辑模板->编辑副本...),然后在名为 PART_popup Popup 中添加 Grid 包含 ItemsPresenter ScrollViewer 。为网格定义两行,网格的底部会自动调整大小,然后在第二行的网格中添加一个按钮,可用于加载其他项目。

Edit the template of the combobox (right click on the control -> Edit Template -> Edit a copy...) and within the Popup named PART_popup add a Grid around the ScrollViewer containing the ItemsPresenter. Define two rows for the grid, the bottom of which is autosized, then add a button to the grid in the second row which can be used to load the additional items.

这是一个示例控件模板:

Here is an example control template:

<ControlTemplate x:Key="ComboBoxTemplate" TargetType="{x:Type ComboBox}">
    <Grid x:Name="templateRoot" SnapsToDevicePixels="true">
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="*"/>
            <ColumnDefinition MinWidth="{DynamicResource {x:Static SystemParameters.VerticalScrollBarWidthKey}}" Width="0"/>
        </Grid.ColumnDefinitions>
        <Popup x:Name="PART_Popup" AllowsTransparency="true" Grid.ColumnSpan="2" IsOpen="{Binding IsDropDownOpen, Mode=TwoWay, RelativeSource={RelativeSource TemplatedParent}}" Margin="1" PopupAnimation="{DynamicResource {x:Static SystemParameters.ComboBoxPopupAnimationKey}}" Placement="Bottom">
            <Themes:SystemDropShadowChrome x:Name="shadow" Color="Transparent" MaxHeight="{TemplateBinding MaxDropDownHeight}" MinWidth="{Binding ActualWidth, ElementName=templateRoot}">
                <Border x:Name="dropDownBorder" BorderBrush="{DynamicResource {x:Static SystemColors.WindowFrameBrushKey}}" BorderThickness="1" Background="{DynamicResource {x:Static SystemColors.WindowBrushKey}}">
                    <Grid> <!-- Add this grid -->
                        <Grid.RowDefinitions>
                            <RowDefinition />
                            <RowDefinition Height="Auto"/>
                        </Grid.RowDefinitions>
                        <ScrollViewer x:Name="DropDownScrollViewer">
                            <Grid x:Name="grid" RenderOptions.ClearTypeHint="Enabled">
                                <Canvas x:Name="canvas" HorizontalAlignment="Left" Height="0" VerticalAlignment="Top" Width="0">
                                    <Rectangle x:Name="opaqueRect" Fill="{Binding Background, ElementName=dropDownBorder}" Height="{Binding ActualHeight, ElementName=dropDownBorder}" Width="{Binding ActualWidth, ElementName=dropDownBorder}"/>
                                </Canvas>
                                <ItemsPresenter x:Name="ItemsPresenter" KeyboardNavigation.DirectionalNavigation="Contained" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"/>
                            </Grid>
                        </ScrollViewer>
                        <!-- Add this button -->
                        <Button Grid.Row="1" Content="Load All" HorizontalAlignment="Stretch" /> 
                    </Grid>
                </Border>
            </Themes:SystemDropShadowChrome>
        </Popup>
        <ToggleButton x:Name="toggleButton" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}" Grid.ColumnSpan="2" IsChecked="{Binding IsDropDownOpen, Mode=TwoWay, RelativeSource={RelativeSource TemplatedParent}}" Style="{StaticResource ComboBoxToggleButton}"/>
        <ContentPresenter x:Name="contentPresenter" ContentTemplate="{TemplateBinding SelectionBoxItemTemplate}" ContentTemplateSelector="{TemplateBinding ItemTemplateSelector}" Content="{TemplateBinding SelectionBoxItem}" ContentStringFormat="{TemplateBinding SelectionBoxItemStringFormat}" HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" IsHitTestVisible="false" Margin="{TemplateBinding Padding}" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}"/>
    </Grid>
    <ControlTemplate.Triggers>
        <Trigger Property="HasDropShadow" SourceName="PART_Popup" Value="true">
            <Setter Property="Margin" TargetName="shadow" Value="0,0,5,5"/>
            <Setter Property="Color" TargetName="shadow" Value="#71000000"/>
        </Trigger>
        <Trigger Property="HasItems" Value="false">
            <Setter Property="Height" TargetName="dropDownBorder" Value="95"/>
        </Trigger>
        <MultiTrigger>
            <MultiTrigger.Conditions>
                <Condition Property="IsGrouping" Value="true"/>
                <Condition Property="VirtualizingPanel.IsVirtualizingWhenGrouping" Value="false"/>
            </MultiTrigger.Conditions>
            <Setter Property="ScrollViewer.CanContentScroll" Value="false"/>
        </MultiTrigger>
        <Trigger Property="ScrollViewer.CanContentScroll" SourceName="DropDownScrollViewer" Value="false">
            <Setter Property="Canvas.Top" TargetName="opaqueRect" Value="{Binding VerticalOffset, ElementName=DropDownScrollViewer}"/>
            <Setter Property="Canvas.Left" TargetName="opaqueRect" Value="{Binding HorizontalOffset, ElementName=DropDownScrollViewer}"/>
        </Trigger>
    </ControlTemplate.Triggers>
</ControlTemplate>

看起来像这样:

然后您可以使用按钮来使源更新(通过单击事件处理程序或命令)。

You can then use the button to cause your source to update (either by click event handler or command).

希望有帮助。

这篇关于单击后WPF ComboBox加载元素的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆