在ComboBox中显示缩短的文件路径,但在ComboBox下拉列表中显示完整路径

时间:2018-04-05 19:05:17

标签: c# wpf xaml combobox

我试图弄清楚如何在ComboBox选择中显示不同于ComboBox下拉列表中显示的字符串。

<ComboBox SelectedItem="{Binding LocalFolderSelection, Mode=OneWayToSource}"
          ItemsSource="{Binding LocalFolders}"
          SelectedIndex="0"/>

这就是我的组合框。 LocalFolders包含一个字符串列表,它基本上是文件路径。由于UI空间有限,我无法使ComboBox非常宽,因此它可以显示整个字符串。下拉列表自动缩放以适应整个路径,这很好,但我需要将显示的选择减少到文件名。

我是如何实现这一目标的? 我希望有一些属性可以用来定义显示文本,也许可以用一个剪切掉路径的转换器将它绑定到SelectedItem,但到目前为止我还没有找到类似的东西。

1 个答案:

答案 0 :(得分:1)

我相信我有你想找的工作。使用具有自定义ItemTemplate的Converter,我们可以显示缩短的路径,并且已修改ContentPresenter以保留完整路径。

enter image description here

XAML:

<Window.Resources>
    <converters:ShortenFilePathConverter x:Key="ShortenFilePathConverter" />
</Window.Resources>

...

<ComboBox SelectedItem="{Binding LocalFolderSelection}" 
        ItemsSource="{Binding LocalFolders}">
    <ComboBox.ItemTemplate>
        <DataTemplate>
            <Label Content="{Binding Converter={StaticResource ShortenFilePathConverter}}"/>
        </DataTemplate>
    </ComboBox.ItemTemplate>
    <ComboBox.ItemContainerStyle>
        <Style TargetType="{x:Type ComboBoxItem}">
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="{x:Type ComboBoxItem}">
                        <Border x:Name="Bd"
                                BorderBrush="{TemplateBinding BorderBrush}"
                                BorderThickness="{TemplateBinding BorderThickness}"
                                Background="{TemplateBinding Background}">
                            <StackPanel Orientation="Horizontal">
                                <ContentPresenter HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" 
                                VerticalAlignment="{TemplateBinding VerticalContentAlignment}">
                                    <ContentPresenter.Content>
                                        <Label Content="{Binding}"/>
                                    </ContentPresenter.Content>
                                </ContentPresenter>
                            </StackPanel>
                        </Border>

                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>
    </ComboBox.ItemContainerStyle>
</ComboBox>

转换器:

public sealed class ShortenFilePathConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        if (value == null)
            return null;

        var s = value as string;

        if (s == null)
            return null;

        return Path.GetFileName(s);
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        return null;
    }
}