【问题标题】:Combobox selection text using ValueConverter使用 ValueConverter 的组合框选择文本
【发布时间】:2015-11-25 06:47:28
【问题描述】:

在选择 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 下拉列表如下所示(这是我所期望的):

第一秒

第一第二

但是,在列表上选择第一个项目时,结果将显示为:

WPF_Test.MainWindow+香蕉

当我期望它显示为:

第一秒

我已经尝试了很多东西,包括在 SelectedItem / SelectedValue / Text 上使用值转换器和使用 DataTemplate 来格式化 Banana 数据类型,但我仍然成功地找到了正确格式化所选文本的方法。

有什么想法吗?

【问题讨论】:

    标签: c# wpf data-binding


    【解决方案1】:

    你需要改变:

    <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;
            }
        }
    }
    

    【讨论】:

    • 不幸的是,更改源类不是一种选择,因为它来自我无法修改的源。
    【解决方案2】:

    如果你不想改变你的数据模型或者你的转换器太复杂,你可以给它设置样式

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-03-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多