我有一个数字值,我希望在显示时将其转换为更加用户友好的字符串格式。我已经有了一个名为FlightLevelConverter
的IValueConverter,我正在使用它为正常的TextBlock
UI项目执行此操作,它可以正常工作。
我现在希望将转换器应用于ComboBox
高度选择,但我无法使其工作。
这是XAML
我用于ComboBox
的相关部分:
<UserControl.Resources>
<status:FlightLevelConverter x:Key="FlightLevelConverter"/>
</UserControl.Resources>
...
<ComboBox x:Name="AltitudeCombo" Grid.Row="0" Grid.Column="3" Width="100">
<ComboBox.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding Converter={StaticResource FlightLevelConverter}}"/>
</DataTemplate>
</ComboBox.ItemTemplate>
</ComboBox>
它显示未转换的数值,而不是漂亮的字符串值。我没有错误,如果我在转换器中设置一个断点,它就不会被击中,表明转换器永远不会被调用。
我整个上午一直在浏览互联网,尤其是 StackOverflow ,试图发现我做错了什么,但没有找到任何有用的东西。
为什么我的转换器没有被调用?我做错了什么?
答案 0 :(得分:3)
如何将项目添加到ComboBox?
您应该将ItemsSource属性设置为数值集合,例如
List<double> values = new List<double>();
values.Add(2.1);
values.Add(3.2);
values.Add(4.3);
values.Add(5.4);
AltitudeCombo.ItemsSource = values;
如果你添加像这样的ComboBoxItem
AltitudeCombo.Items.Add(new ComboBoxItem() { Content = 1.4 });
ItemTemplate因此不会应用与其转换器的绑定。
答案 1 :(得分:3)
这是一个简短的工作样本。你可以比较代码......
XAML:
<Window x:Class="WpfApplication1.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:bys="clr-namespace:WpfApplication1"
xmlns:sys="clr-namespace:System;assembly=mscorlib"
Title="MainWindow" Height="350" Width="525">
<Grid>
<Grid.Resources>
<bys:MyList x:Key="lst"/>
<bys:MyConverter x:Key="myConverter"/>
</Grid.Resources>
<ComboBox ItemsSource="{StaticResource lst}" SelectedIndex="0">
<ComboBox.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding Converter={StaticResource myConverter}}"/>
</DataTemplate>
</ComboBox.ItemTemplate>
</ComboBox >
</Grid>
</Window>
C#:
public class MyList : List<int> {
public MyList() {
AddRange(new[] { 1, 2, 3, 4, 5, 6 });
}
}
public class MyConverter : IValueConverter {
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) {
return String.Format("<<{0}>>", value);
}
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) {
throw new NotImplementedException();
}
}
答案 2 :(得分:-1)
如果ComboBox.IsEditable == true,则ComboBox.ItemTemplate不适用于ComboBox的主要部分。它仅适用于下拉列表条目。尝试设置ComboBox.IsEditable == false。这可能有所帮助。