C# 使用ValueConverter的组合框选择文本

C# 使用ValueConverter的组合框选择文本,c#,wpf,data-binding,C#,Wpf,Data Binding,在组合框中选择一个项目时,我一直在努力获得一个可编辑的WPF组合框来显示正确的文本 我正在使用ValueConverter为每个项目设置文本格式,这在下拉选择列表中非常有效,但只要我在列表中选择了一个项目,所选文本就会显示类型的名称,而不是下拉列表中所显示的所选项目的值 我的XAML代码如下所示: <Window.Resources> <local:BananaConverter x:Key="BananaConverter" /> </

在组合框中选择一个项目时,我一直在努力获得一个可编辑的WPF组合框来显示正确的文本

我正在使用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();
    }
}
我的组合框下拉列表如下所示,这正是我所期望的:

第一秒

第一第二

但是,当选择列表上的第一项时,结果将显示为:

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>