Странные проблемы с привязкой данных в wpf combobox - PullRequest
2 голосов
/ 01 марта 2011

Я пишу то, что оказывается простым графическим интерфейсом в WPF.На данный момент у меня есть статический список внутри ComboBox, например:

    <ComboBox HorizontalAlignment="Left" Height="22" Margin="24,97,0,0" VerticalAlignment="Top" Width="83"
        SelectedItem="{Binding fruit, Mode=TwoWay}">
        <ComboBoxItem>apple</ComboBoxItem>
        <ComboBoxItem>orange</ComboBoxItem>
        <ComboBoxItem>grape</ComboBoxItem>
        <ComboBoxItem>banana</ComboBoxItem>
    </ComboBox>

Я привязываю SelectedItem к одиночному элементу в моем коде, который уже был инициализирован и использован в другом месте.

Я ставлю точку останова на get из fruit, и она возвращает "grape", но выбранный элемент всегда пуст.Я даже добавил кнопку, чтобы я мог вызвать RaisePropertyChanged вручную, но вызов RaisePropertyChange тоже ничего не сделал.

Наконец, MVVMLight обеспечивает смешиваемость.Ни по какой важной причине я изменил привязку в выпадающем списке с SelectedItem на Text. Как только я это сделал, моя форма времени разработки заполнилась ожидаемыми значениями, но, когда код работает, окно продолжает сидетьв пустом состоянии

Ответы [ 2 ]

5 голосов
/ 01 марта 2011

Это потому, что у вас есть элементы типа ComboBoxItem в ComboBox, но свойство, к которому вы пытаетесь привязать, имеет тип string.

У вас есть три варианта:

1. Вместо добавления ComboBoxItem элементов добавляется String элементов:

<ComboBox HorizontalAlignment="Left" Height="22" Margin="24,97,0,0" VerticalAlignment="Top" Width="83"
    SelectedItem="{Binding fruit, Mode=TwoWay}">
    <sys:String>apple</sys:String>
    <sys:String>orange</sys:String>
    <sys:String>grape</sys:String>
    <sys:String>banana</sys:String>
</ComboBox>

2. Вместо SelectedItem привязывается к SelectedValue и задается SelectedValuePath как Content:

<ComboBox HorizontalAlignment="Left" Height="22" Margin="24,97,0,0" VerticalAlignment="Top" Width="83"
    SelectedValue="{Binding fruit, Mode=TwoWay}"
    SelectedValuePath="Content">
    <ComboBoxItem>apple</ComboBoxItem>
    <ComboBoxItem>orange</ComboBoxItem>
    <ComboBoxItem>grape</ComboBoxItem>
    <ComboBoxItem>banana</ComboBoxItem>
</ComboBox>

3.Не указывайте элементы непосредственно в XAML, но используйте свойство ItemsSource для привязки к коллекции строк:

<ComboBox HorizontalAlignment="Left" Height="22" Margin="24,97,0,0" VerticalAlignment="Top" Width="83"
    ItemsSource="{Binding Fruits}"
    SelectedItem="{Binding fruit, Mode=TwoWay}"/>
1 голос
/ 01 марта 2011

Вы должны связать ComboBox.ItemSource со списком строк (сделайте список строк ObservableCollection<string> в случае, если вы добавляете элементы в этот список), а затем установите переменную fruit для экземпляра в списке строк.

Я думаю, у вас есть проблема, потому что ваша переменная fruit ссылается на другой экземпляр, чем у вас в вашем списке ComboBoxItems. (хотя строки одинаковые)

...