在我解释我的问题之前,请考虑以下对象:
Character.cs
-> AnimationControlSettings.cs
.. -> UpControlType (string)
.. -> AvailableControlTypes (List<string>)
我的ViewModel中的相关属性:
Character SelectedCharacter
ObservableCollection<Character> Characters
我有一个简单的视图,您可以使用ComboBox选择一个角色。 ComboBox的SelectedItem是两个绑定到ViewModel的SelectedCharacter属性的。还有其他文本框/复选框(也是双向绑定到SelectedCharacter的各种属性),当我在字符之间切换时,它们可以正确地保持它们的值。
绑定到UpControlType属性的ComboBox中存在问题:
<ComboBox x:Name="lstUpControlTypes"
ItemsSource="{Binding Path=SelectedCharacter.AnimationControlSettings.AvailableControlTypes}"
SelectedItem="{Binding Path=SelectedCharacter.AnimationControlSettings.UpControlType, Mode=TwoWay}">
</ComboBox>
初始值正确显示在此ComboBox中,但只要我从CharacterA切换到CharacterB,CharacterA的UpControl属性就会设置为NULL,我不明白为什么。
这是这个确切问题的准系统复制品(VS2010,SL4): http://www.checksumlabs.com/source/TwoWayBindingWorkshop.zip
如果运行该解决方案,您会看到Name属性在切换字符时仍然存在,但UpControlType值设置为NULL。
我错过了一些明显的东西吗?
答案 0 :(得分:1)
您将第三个组合框的项目源绑定到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}" />