WPF 多列组合框

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/23893348/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-09-13 11:47:37  来源:igfitidea点击:

WPF Multicolumn Combobox

wpfcomboboxmultiple-columns

提问by Dan

I have the following data template used for a multicolumn combo box:

我有以下用于多列组合框的数据模板:

<DataTemplate x:Key="ShipViaKey">
    <Grid Height="23" Width="Auto" ShowGridLines="False">
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="100"/>
            <ColumnDefinition Width="*"/>
        </Grid.ColumnDefinitions>

        <TextBlock Grid.Column="0" Text="{Binding Code}"/>
        <TextBlock Grid.Column="1" Text="{Binding Carrier}"/>
    </Grid>
</DataTemplate>

The combo box is defined like this:

组合框定义如下:

<ComboBox Grid.Row="0" Grid.Column="1" x:Name="CboShipVia" SelectedValue="{Binding FkCarrier, Mode=TwoWay}" SelectedValuePath="PkCarrier" IsEnabled="{Binding HasData}" ItemTemplate="{StaticResource ShipViaKey}"/>

This is all fine; except I want to only display the "Code" of the selected item in the combo box, not both values. Is there a way to do this?

这一切都很好;除了我只想在组合框中显示所选项目的“代码”,而不是两个值。有没有办法做到这一点?

回答by amnezjak

Instead of ItemTemplate, use ItemContainerStyle:

而不是ItemTemplate,使用ItemContainerStyle

<ComboBox.ItemContainerStyle>
    <Style TargetType="ComboBoxItem">
        <Setter Property="ContentTemplate">
            <Setter.Value>
                <DataTemplate>
                    <Grid Height="23" Width="Auto" ShowGridLines="False">
                        <Grid.ColumnDefinitions>
                            <ColumnDefinition Width="100"/>
                            <ColumnDefinition Width="*"/>
                        </Grid.ColumnDefinitions>

                        <TextBlock Grid.Column="0" Text="{Binding Code}"/>
                        <TextBlock Grid.Column="1" Text="{Binding Carrier}"/>
                    </Grid>
                </DataTemplate>
            </Setter.Value>
        </Setter>
    </Style>
</ComboBox.ItemContainerStyle>

Also, set DisplayMemberPathto Codeproperty.

此外,设置DisplayMemberPathCode属性。

回答by alphanoch

I came up with this solution that provides columns vertical alignmentthanks to the SharedSizeGroup feature.

由于 SharedSizeGroup 功能,我想出了这个提供列垂直对齐的解决方案。

Resources:

资源:

<DataTemplate x:Key="advancedComboxItemDataTemplate">
    <Grid Width="Auto">
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="Auto" SharedSizeGroup="A"/>
            <ColumnDefinition Width="*"/>
        </Grid.ColumnDefinitions>
        <TextBlock Text="{Binding Caption}" Margin="5" Grid.Column="0" TextAlignment="Left"/>
        <TextBlock Text="{Binding Description}" Margin="5" Grid.Column="1" TextAlignment="Left">
            <TextBlock.Style>
                <Style TargetType="TextBlock">
                    <Style.Triggers>
                        <DataTrigger Binding="{Binding RelativeSource={RelativeSource AncestorType=ComboBoxItem}, Path=IsSelected}" Value="{x:Null}">
                            <Setter Property="Visibility" Value="Collapsed"/>
                        </DataTrigger>
                    </Style.Triggers>
                </Style>
            </TextBlock.Style>
        </TextBlock>
    </Grid>
</DataTemplate>

<ItemsPanelTemplate x:Key="advancedComboxItemsPanelTemplate">
    <StackPanel Grid.IsSharedSizeScope="True" IsItemsHost="True"/>
</ItemsPanelTemplate>

Usage:

用法:

<ComboBox Width="300"
          ItemsSource="{Binding ReferentialData.BankReferences}" 
          SelectedItem="{Binding SelectedObject.PayTermBankReference}"
          ItemTemplate="{StaticResource advancedComboxItemDataTemplate}"
          ItemsPanel="{StaticResource advancedComboxItemsPanelTemplate}"/>