Значения параметра ComboBox, привязанные к Silverlight с двумя путями, равны NULL - PullRequest
2 голосов
/ 19 октября 2010

Прежде чем я объясню свою проблему, рассмотрим следующий объект:

Character.cs

-> AnimationControlSettings.cs

..  -> UpControlType (string)

..  -> AvailableControlTypes (List<string>)

Соответствующие свойства в моей ViewModel:

Character SelectedCharacter
ObservableCollection<Character> Characters

У меня есть простой вид, где вы выбираете символ с помощью ComboBox. SelectedItem ComboBox привязан к двухстороннему соединению со свойством ViewModel SelectedCharacter. Существуют другие текстовые поля / флажки (также двусторонне связанные с различными свойствами SelectedCharacter), которые правильно сохраняют свои значения при переключении между символами.

Проблема существует в ComboBox, связанном со свойством UpControlType:

<ComboBox x:Name="lstUpControlTypes" 
        ItemsSource="{Binding Path=SelectedCharacter.AnimationControlSettings.AvailableControlTypes}" 
        SelectedItem="{Binding Path=SelectedCharacter.AnimationControlSettings.UpControlType, Mode=TwoWay}">
</ComboBox>

Начальные значения отображаются в этом ComboBox правильно, но как только я переключаюсь с CharacterA на CharacterB, свойство UpControl CharacterA устанавливается в NULL, и я не знаю почему.

Вот репродукция скелетона этой точной проблемы (VS2010, SL4): http://www.checksumlabs.com/source/TwoWayBindingWorkshop.zip

Если вы запустите это решение, вы увидите, что свойство Name сохраняется при переключении символов, но значение UpControlType становится равным NULL.

Я что-то упускаю здесь очевидное?

1 Ответ

1 голос
/ 20 октября 2010

Вы привязываете источник элементов третьего поля со списком к свойству внутри SelectedCharacter, например:

ItemsSource="{Binding SelectedCharacter.AnimationControlSettings.AvailableControlTypes}" 

Это означает, что при изменении SelectedCharacter источник элементов для этого поля со списком будет сброшен, и это активирует двустороннюю привязку, установленную в SelectedItem того же поля со списком, установив для вашего свойства значение null:

SelectedItem="{Binding SelectedCharacter.AnimationControlSettings.UpControlType, Mode=TwoWay}"

Мне удалось устранить проблему, переместив свойство AvailableControlTypes в класс CharacterViewModel, что означает, что при изменении символа доступные типы остаются прежними. Если это приемлемо в вашей ситуации, это решит вашу проблему:

            <ComboBox x:Name="lstUpControlTypes" 
                      ItemsSource="{Binding AvailableControlTypes}" 
                      SelectedItem="{Binding     SelectedCharacter.AnimationControlSettings.UpControlType, Mode=TwoWay}" />
...