Подтвердить что ты не робот

WPF ComboBox: статический список ComboBoxItems, но привязка данных SelectedItem?

В моем приложении WPF у меня есть ComboBox, который заполнен статическим списком ComboBoxItems, потому что его содержимое никогда не изменится. Однако, поскольку я хочу привязать выбранный элемент к моему базовому ViewModel, я хочу, чтобы каждый ComboBoxItem также имел отдельное значение, которое должно быть присвоено моему свойству ViewModel. И у меня есть немного проблем, чтобы заставить это работать.

Объявление My ComboBox выглядит так:

    <ComboBox Height="23" HorizontalAlignment="Stretch" Margin="2" Name="comboBox1" VerticalAlignment="Top"
              SelectedItem="{Binding Path=Amount, Mode=TwoWay}" SelectedValuePath="Tag" >
        <ComboBoxItem Content="None" Tag="0" />
        <ComboBoxItem Content="Few" Tag="1" />
        <ComboBoxItem Content="Some" Tag="2" />
        <ComboBoxItem Content="Enough" Tag="3" />
        <ComboBoxItem Content="Lots" Tag="4" />
        <ComboBoxItem Content="Too much" Tag="5" />
    </ComboBox>

Выбранный элемент этого ComboBox привязан к свойству ViewModel Amount, объявленному как целое число:

public class MyViewModel : INotifyPropertyChanged
{
    private int _amount = 3;

    public int Amount
    {
        get { return _amount; }
        set
        {
            _amount = value;
            OnPropertyChanged("Amount");
        }
    }

    //...
}

Я надеялся, что SelectedValuePath = "Тег" сообщит WPF, что он должен использовать значение тега для привязки к свойству ViewModel Amount, но когда я запускаю это приложение и изменяю выбранный элемент ComboBox, трассировка отладки говорит мне:

System.Windows.Data Error: 23 : Cannot convert 'System.Windows.Controls.ComboBoxItem: Some' from type 'ComboBoxItem' to type 'System.Int32' for 'en-US' culture ...
System.Windows.Data Error: 7 : ConvertBack cannot convert value 'System.Windows.Controls.ComboBoxItem: Some' (type 'ComboBoxItem'). (...) System.NotSupportedException: Int32Converter cannot convert from System.Windows.Controls.ComboBoxItem.

По-видимому, он пытается связать весь ComboBoxItem с моей ViewModel, а не только с его значением Tag. Что я делаю неправильно?

4b9b3361

Ответ 1

Если вы используете SelectedValuePath, вам нужно привязать к свойству SelectedValue, которое

Получает или задает значение SelectedItem, полученное с помощью SelectedValuePath

Итак, измените привязку к

SelectedValue="{Binding Path=Amount, Mode=TwoWay}" 

поскольку, как вы испытали, SelectedItem всегда будет содержать фактически выбранный элемент (в вашем случае ComboBoxItem), а не значение.