【发布时间】:2015-03-13 12:32:02
【问题描述】:
我想使用 MVVM 模式(初学者)获取 ComboBox 的选定项。 我读过这可以通过将 SelectedItem 属性绑定到 ViewModel 中的属性来实现。
XAML:
<ComboBox ItemsSource="{Binding RoomLockerLinkCollection}"
DisplayMemberPath="Room.Name"
SelectedItem="{Binding SelectedRoom}"/>
视图模型:
public Room SelectedRoom { get; set; }
但它不起作用 - 唯一发生的事情是该 ComboBox 周围出现红色边框 - 此外,在 ComboBox 中选择一个新项目后,我的 VM 中的“SelectedRoom”属性仍然为空。
编辑 1:
一个简短的附加问题:
绑定工作正常 - 至少对于顶级“类别”。我的 Wrapper-Class 还包含一个储物柜列表。
<ComboBox DataContext="{Binding SelectedItem, ElementName=_cmbRoomSelection}" ItemsSource=" {Binding LockerCollection}" DisplayMemberPath="Name" SelectedValue="{Binding SAVM.SelectedLocker, Mode=TwoWay}" />
当我检查 SelectedValue 的类型时,它是一个“储物柜”——很好。 但是我的 VM 中的 SelectedLocker-Property 保持为空...
附加的,可以。解释何时使用“SelectedItem”和“SelectedValue”?有什么不同?上面xaml代码中设置DataContext不能通过绑定SelectedValue来实现...
编辑 2(解决方案):
好的,明白了!
我发现我已经重置了我的 DataContext - 现在当然找不到 Property SAVM。
解决方案:
<ComboBox DataContext="{Binding SelectedItem, ElementName=_cmbRoomSelection}"
ItemsSource="{Binding LockerCollection}"
DisplayMemberPath="Name"
SelectedValue="{Binding SAVM.SelectedLocker **ElementName=_vStorage**, Mode=TwoWay}" />
【问题讨论】:
-
红框表示验证错误,你的属性和你的ItemsSource可能不是同一类型。
-
天哪,你说的太对了 - 在将属性的类型设置为 object 以检查我使用的是哪种类型之后,我意识到我正在为此使用包装器......有没有办法将选定项的属性链接到我的 mv 中的属性?例如我的组合框包含 roomLockerLink 类型的对象,其中包含一个房间和一个储物柜列表 - 但我想提取包含房间以将其保存在我的 mv 属性中。希望能得到我想说的......
-
是的,一秒钟我会写一个答案。与此同时,阅读 SelectValue 和 SelectedValuePath
-
发布 LockerCollection 和 SelectedLocker 属性。此外,搜索如何检测 wpf 中的绑定错误。使用正确的工具很容易检测到某些内容未通过绑定更新的原因。 Snoop 或 Visual Studio 的输出窗口。