我试图弄清楚如何在ComboBox选择中显示不同于ComboBox下拉列表中显示的字符串。
<ComboBox SelectedItem="{Binding LocalFolderSelection, Mode=OneWayToSource}"
ItemsSource="{Binding LocalFolders}"
SelectedIndex="0"/>
这就是我的组合框。 LocalFolders
包含一个字符串列表,它基本上是文件路径。由于UI空间有限,我无法使ComboBox非常宽,因此它可以显示整个字符串。下拉列表自动缩放以适应整个路径,这很好,但我需要将显示的选择减少到文件名。
我是如何实现这一目标的? 我希望有一些属性可以用来定义显示文本,也许可以用一个剪切掉路径的转换器将它绑定到SelectedItem,但到目前为止我还没有找到类似的东西。
答案 0 :(得分:1)
我相信我有你想找的工作。使用具有自定义ItemTemplate的Converter,我们可以显示缩短的路径,并且已修改ContentPresenter以保留完整路径。
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;
}
}