Silverlight ComboBox TwoWay绑定失败

时间:2011-06-01 13:59:51

标签: silverlight binding combobox

这不是一个问题,而是一个答案,答案似乎对某些人来说非常明显,但我认为它可能对其他人有用!

我首先发布了这个帖子。情景就在答案中。

1 个答案:

答案 0 :(得分:0)

我有一个MainView / MainViewModel和一个SearchView / SearchViewModel。

我在MainView上有一个ComboBox,上面填充了一个'Gender'对象列表(绑定到

ObservableCollection<Gender> Genders
MainViewModel中的

MainViewModel具有Person类型的属性,而该属性又具有Gender类型的属性。 Gender对象具有ID和Description属性(描述显示在组合中)。

ComboBox的SelectedItem属性在TwoWay模式下绑定到'Person.Gender'。

当使用它在新的Person对象上设置Gender的值时,一切都很好。然后允许用户搜索现有的Person。我根据参数检索数据并创建了一个Person对象列表,并通过MVVM Light Toolkit的Messenger将它们传递给SearchViewModel。然后,它们以模态方式显示在SearchView的网格中。当用户选择Person时,这个(SelectedPerson)从SearchViewModel传回到MainViewModel,再次使用MVVM Light的Messenger。

这是我被困一段时间的地方。我编码了

Person.Gender = SelectedPerson.Gender

并期望使用正确的性别更新ComboBox,但事实并非如此。

我搜索了绑定问题,并找到了一个关于以正确的顺序拥有XAML ItemsSource和SelectedItems属性的问题。我尝试创建一个新的性别,例如 Person.Gender = new Gender {ID = SelectedPerson.Gender.ID ...等但这不起作用。

然后我突然意识到,尽管ComboBox中的Gender与SelectedPerson对象中的Gender具有完全相同的属性,但它并没有使它成为EQUAL而是我在考虑人类而不是编程术语。 DID等于ComboBox上的那个的Gender对象位于ComboBox绑定的集合中(即ObservableCollection Genders)。因此,为了得到它,我做了这个

            if (SelectedPerson.Gender != null)
            {
                foreach (Gender g in Genders)
                {
                    if (SelectedPerson.Gender.ID == g.ID)
                    {
                        Person.Gender = g;
                        break;
                    }
                }
            }

正如我所说,这对某些人来说可能是显而易见的,但是当我最初被卡住时,我没有找到任何看起来像这样的解决方案,因为没有人描述这样的场景。我猜想在某些情况下场景是相似的,但提问者没有意识到,即对象的相等性。