在选择ComboBox中的一个项目时,我一直在努力寻找可编辑的WPF ComboBox来显示正确的文本。
我使用ValueConverter格式化每个项目的文本,这在下拉选择列表中效果很好,但只要我在列表中选择一个项目,所选文本就会显示该类型的名称,而不是所选项目的值(如下拉列表中所示)。
我的XAML代码如下所示:
<Window.Resources>
<local:BananaConverter x:Key="BananaConverter" />
</Window.Resources>
<Grid>
<ComboBox IsEditable="True" ItemsSource="{Binding ElementName=MyWindow, Path=Bananas}" >
<ComboBox.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding Converter={StaticResource BananaConverter}}" />
</DataTemplate>
</ComboBox.ItemTemplate>
</ComboBox>
</Grid>
背后的代码:
public partial class MainWindow:Window
{
public MainWindow()
{
Bananas = new Banana[]
{
new Banana("First", "Second"),
new Banana("1st", "2nd"),
};
InitializeComponent();
}
public struct Banana
{
public Banana(string first, string second)
{
First = first;
Second = second;
}
public string First;
public string Second;
}
public IList<Banana> Bananas
{
get;
set;
}
}
[ValueConversion(typeof(MainWindow.Banana), typeof(string))]
public class BananaConverter :IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
MainWindow.Banana? banana = value as MainWindow.Banana?;
if(!banana.HasValue)
return "Meh, that is bad";
return banana.Value.First+" "+banana.Value.Second;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
我的ComboBox下拉列表看起来像这样(这是我的期望):
第一秒
第1次
但是,当选择列表中的第一项时,结果将显示为:
WPF_Test.MainWindow +香蕉
当我希望它显示为:
第一秒
我尝试了很多东西,包括在SelectedItem / SelectedValue / Text上使用值转换器并使用DataTemplate格式化Banana数据类型,但我仍然在成功找到一种方法来正确格式化所选文本。
有什么想法吗?
答案 0 :(得分:0)
您需要更改:
<ComboBox IsEditable="True" ItemsSource="{Binding ElementName=MyWindow, Path=Bananas}" >
通过
<ComboBox IsEditable="True" TextSearch.TextPath="TwoParts" ItemsSource="{Binding ElementName=MyWindow, Path=Bananas}" >
更改结构:
public struct Banana
{
public Banana(string first, string second)
{
First = first;
Second = second;
}
public string First;
public string Second;
public string TwoParts
{
get
{
return First + " " + Second;
}
}
}
答案 1 :(得分:0)
如果您不想更改数据模型或转换器太复杂,可以设置样式
<ComboBox ItemsSource="{Binding TempCollection}">
<ComboBox.ItemTemplate>
<DataTemplate>
<Label Content="{Binding Converter={StaticResource TempConverter}}"/>
</DataTemplate>
</ComboBox.ItemTemplate>
<ComboBox.ItemContainerStyle>
<Style TargetType="{x:Type ComboBoxItem}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type ComboBoxItem}">
<Border
BorderBrush="{TemplateBinding BorderBrush}"
BorderThickness="{TemplateBinding BorderThickness}"
Background="{TemplateBinding Background}">
<StackPanel Orientation="Horizontal">
<ContentPresenter HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"
VerticalAlignment="{TemplateBinding VerticalContentAlignment}" />
</StackPanel>
</Border>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</ComboBox.ItemContainerStyle>
</ComboBox>