使用Silverlight中的转换器绑定到ComboBox

时间:2012-02-20 11:13:49

标签: wpf silverlight xaml data-binding combobox

我有一个数字值,我希望在显示时将其转换为更加用户友好的字符串格式。我已经有了一个名为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 ,试图发现我做错了什么,但没有找到任何有用的东西。

为什么我的转换器没有被调用?我做错了什么?

3 个答案:

答案 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。这可能有所帮助。