使用ValueConverter进行组合框选择文本

时间:2015-11-25 06:47:28

标签: c# wpf data-binding

在选择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数据类型,但我仍然在成功找到一种方法来正确格式化所选文本。

有什么想法吗?

2 个答案:

答案 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>