【发布时间】: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