Привязка к ComboBox с конвертером в Silverlight - PullRequest
1 голос
/ 20 февраля 2012

У меня есть числовое значение, которое я хочу преобразовать в более удобный для пользователя формат строки при его отображении.У меня уже есть IValueConverter с именем FlightLevelConverter, который я использую для этого для обычного TextBlock элемента пользовательского интерфейса, где он работает нормально.

Теперь я хочу применить конвертер для высоты 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 ]

3 голосов
/ 20 февраля 2012

Как добавить элементы в 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;

Если вы добавите ComboBoxItems, как это

AltitudeCombo.Items.Add(new ComboBoxItem() { Content = 1.4 });

ItemTemplate и, следовательно, привязка с его конвертером не будут применяться.

3 голосов
/ 20 февраля 2012

Вот краткий рабочий образец. Вы можете сравнить код ...

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();
    }
}
0 голосов
/ 20 февраля 2012

ComboBox.ItemTemplate не применяется к основной части ComboBox, если ComboBox.IsEditable == true.Работает только для записей в выпадающем списке.Попробуйте установить ComboBox.IsEditable == false.Это может помочь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...