Связанный с данными WPF ComboBox с вариантами, определенными в XAML?

На моей модели просмотра у меня есть свойство int, и я хочу показать его для редактирования с помощью ComboBox с ограниченным набором вариантов, например 16, 8, 4 и 2. Есть ли способ указать выбор в XAML, все еще привязывая значение к viewmodel? Я хотел бы сделать что-то вроде этого:

<ComboBox SelectedValue="{Binding MyIntProperty}">
    <ComboBoxItem>16</ComboBoxItem>
    <ComboBoxItem>8</ComboBoxItem>
    <ComboBoxItem>4</ComboBoxItem>
    <ComboBoxItem>2</ComboBoxItem>
</ComboBox>

Я знаю, что смогу подстроить код List<int> в коде и установить его как ItemSource, но я надеюсь, что есть способ сделать это, что не включает лишнее свойство в viewmodel, которое предоставляет коллекцию, созданную в код.

Ответ 1

Вы можете указать свой выбор точно так же, как в своем примере. Как выглядит ваш недостающий, чтобы он работал, это свойство SelectedValuePath. Без него SelectedValue будет таким же, как SelectedItem. Установив SelectedValuePath = "Content" в ComboBox, вы можете указать, что привязка SelectedValue вместо этого привязана только к части SelectedItem, в этом случае содержимое Int, указанное вами в качестве содержимого в каждом ComboBoxItem.

Здесь небольшая демонстрация с ним, а также привязка значения к TextBox, где вы можете установить элемент и увидеть его отражение в ComboBox с помощью привязки SelectedValue (или наоборот).

<StackPanel>
    <StackPanel Orientation="Horizontal">
        <TextBlock Text="Set Value:" />
        <TextBox Text="{Binding MyIntProperty, UpdateSourceTrigger=PropertyChanged}" />
    </StackPanel>
    <StackPanel Orientation="Horizontal">
        <TextBlock Text="Select Value:" />
        <ComboBox SelectedValue="{Binding MyIntProperty}" SelectedValuePath="Content">
            <ComboBoxItem>2</ComboBoxItem>
            <ComboBoxItem>4</ComboBoxItem>
            <ComboBoxItem>6</ComboBoxItem>
            <ComboBoxItem>8</ComboBoxItem>
            <ComboBoxItem>16</ComboBoxItem>
        </ComboBox>
    </StackPanel>
</StackPanel>