在XAML Combobox多选中更改显示的文本

时间:2017-01-24 20:25:38

标签: wpf xaml checkbox mvvm

我有以下代码允许用户从组合框中选择多个项目。但是,当他们单击一个项目时,它会在组合框关闭时将其显示为显示的文本。我可以将显示的文本更改为不仅仅是所选项目的内容。例如,如果用户选择项目A,B和D,我希望组合框的文本部分显示“A,B,D”

<ComboBox ItemsSource="{Binding ListOfItems}">
            <ComboBox.ItemTemplate>
                <DataTemplate>
                    <StackPanel Orientation="Horizontal">
                        <CheckBox IsChecked="{Binding IsChecked, Mode=TwoWay}" Width="20" />
                        <TextBlock Text="{Binding DisplayName}" Width="110" />
                    </StackPanel>
                </DataTemplate>
            </ComboBox.ItemTemplate>
        </ComboBox>

由于

1 个答案:

答案 0 :(得分:1)

您可以将ContentControl与Style一起使用,以更改所选项目的ContentTemplate属性。以下示例标记应该为您提供想法。

<ComboBox ItemsSource="{Binding ListOfItems}">
    <ComboBox.ItemTemplate>
        <DataTemplate>
            <ContentControl Content="{Binding}">
                <ContentControl.Style>
                    <Style TargetType="ContentControl">
                        <Setter Property="ContentTemplate">
                            <Setter.Value>
                                <!-- the template for the items in the dropdown list -->
                                <DataTemplate>
                                    <StackPanel Orientation="Horizontal">
                                        <CheckBox IsChecked="{Binding IsChecked, Mode=TwoWay}" Width="20" />
                                        <TextBlock Text="{Binding DisplayName}" Width="110" />
                                    </StackPanel>
                                </DataTemplate>
                            </Setter.Value>
                        </Setter>
                        <Style.Triggers>
                            <DataTrigger Binding="{Binding RelativeSource={RelativeSource AncestorType=ComboBoxItem}}" Value="{x:Null}">
                                <Setter Property="ContentTemplate">
                                    <Setter.Value>
                                        <!-- the template for the selected item-->
                                        <DataTemplate>
                                            <ItemsControl ItemsSource="{Binding ItemsSource, RelativeSource={RelativeSource AncestorType=ComboBox}}">
                                                <ItemsControl.ItemsPanel>
                                                    <ItemsPanelTemplate>
                                                        <WrapPanel />
                                                    </ItemsPanelTemplate>
                                                </ItemsControl.ItemsPanel>
                                                <ItemsControl.ItemTemplate>
                                                    <DataTemplate>
                                                        <TextBlock Text="{Binding DisplayName}" Margin="0 0 5 0"/>
                                                    </DataTemplate>
                                                </ItemsControl.ItemTemplate>
                                            </ItemsControl>
                                        </DataTemplate>
                                    </Setter.Value>
                                </Setter>
                            </DataTrigger>
                        </Style.Triggers>
                    </Style>
                </ContentControl.Style>
            </ContentControl>
        </DataTemplate>
    </ComboBox.ItemTemplate>
</ComboBox>

有关详细信息,请参阅以下类似问题。

Can I use a different Template for the selected item in a WPF ComboBox than for the items in the dropdown part?