Связанный с данными WPF ComboBox с вариантами, определенными в XAML? - PullRequest
10 голосов
/ 17 декабря 2009

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

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

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

1 Ответ

13 голосов
/ 17 декабря 2009

Вы можете указать свой выбор точно так же, как в своем примере. То, что кажется отсутствующим, чтобы заставить это работать, является свойством 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>
...