C# 使用ValueConverter的组合框选择文本
在组合框中选择一个项目时,我一直在努力获得一个可编辑的WPF组合框来显示正确的文本 我正在使用ValueConverter为每个项目设置文本格式,这在下拉选择列表中非常有效,但只要我在列表中选择了一个项目,所选文本就会显示类型的名称,而不是下拉列表中所显示的所选项目的值 我的XAML代码如下所示:C# 使用ValueConverter的组合框选择文本,c#,wpf,data-binding,C#,Wpf,Data Binding,在组合框中选择一个项目时,我一直在努力获得一个可编辑的WPF组合框来显示正确的文本 我正在使用ValueConverter为每个项目设置文本格式,这在下拉选择列表中非常有效,但只要我在列表中选择了一个项目,所选文本就会显示类型的名称,而不是下拉列表中所显示的所选项目的值 我的XAML代码如下所示: <Window.Resources> <local:BananaConverter x:Key="BananaConverter" /> </
<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();
}
}
我的组合框下拉列表如下所示,这正是我所期望的:
第一秒
第一第二
但是,当选择列表上的第一项时,结果将显示为:
WPF_测试。主窗口+香蕉
当我期望它显示为:
第一秒
我已经尝试了很多方法,包括在SelectedItem/SelectedValue/Text上使用值转换器,以及使用DataTemplate格式化香蕉数据类型,但我仍然成功地找到了正确格式化所选文本的方法
有什么想法吗?您需要更改:
<ComboBox IsEditable="True" ItemsSource="{Binding ElementName=MyWindow, Path=Bananas}" >
如果不想更改数据模型或转换器太复杂,可以对其进行样式设置
<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>
不幸的是,更改源类不是一个选项,因为它来自一个我无法修改的源。
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;
}
}
}
<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>