【发布时间】:2014-03-25 20:54:01
【问题描述】:
WPF、MVVM
我发现如果我在 ComboBox 中使用 CollectionViewSource,当我关闭窗口时,如果 SelectedValue 绑定到字符串属性,则会执行对 SelectedValue Setter 的额外调用。如果我将 ItemsSource 绑定直接设置到 VM,则不会发生此调用。额外的调用导致 VM 中的值发生更改,从而导致数据不正确。我有其他 ComboBoxes 以相同的方式设置,但它们绑定到整数值。
CollectionViewSource 定义:
<CollectionViewSource x:Key="AllClientsSource" Source="{Binding AllClients}" >
<CollectionViewSource.SortDescriptions>
<scm:SortDescription PropertyName="ClientName" />
</CollectionViewSource.SortDescriptions>
</CollectionViewSource>
带有 CollectionViewSource 的组合框:
<ComboBox Grid.Column="2"
ItemsSource="{Binding Source={StaticResource AllClientsSource}}"
DisplayMemberPath="ClientName" SelectedValuePath="ClientId"
SelectedValue="{Binding Path=ClientId}"
Visibility="{Binding Path=IsEditingPlan, Converter={StaticResource BoolVisibility}}" />
ComboBox 直接到 VM(正在排序):
<ComboBox Grid.Column="2" ItemsSource="{Binding AllClients}"
DisplayMemberPath="ClientName" SelectedValuePath="ClientId"
SelectedValue="{Binding Path=ClientId}"
Visibility="{Binding Path=IsEditingPlan, Converter={StaticResource BoolVisibility}}" />
谁能告诉我为什么有一个使用 CollectionViewSource 的额外 setter 调用?字符串绑定有什么不同?有没有办法正确解决它?
编辑:我尝试更改它并使用组合框上的 SelectItem 属性。结果相同。因此,如果项目是标量数据类型,它似乎可以按预期工作。如果它是一个对象,你会得到一个额外的带有空值的 setter 调用。同样,如果我从等式中删除 CollectionViewSource,它会按预期工作。
再次编辑:我添加了一个指向 sample project 的链接来说明问题。目标 .Net 4.5。
- 运行项目。
- 点击显示查看一个
- 选择一个客户,客户名称将显示在右侧。
- 点击显示查看二
- 返回查看一 - 请注意,所选客户端不再被选中。
- 点击显示查看三
- 选择区域,区域名称显示在右侧。
- 返回查看二
- 返回查看三 - 请注意,所选区域仍处于选中状态。
视图之间的唯一区别是 One 和 Two 使用 CollectionViewSource。三个直接绑定到 ViewModel。当您从 One 或 Two 移动到新选项卡时,所选项目的 setter 将使用空值调用。为什么?最好的解决方法是什么?
谢谢。
【问题讨论】:
-
你能在一个简单的测试项目中复制这个吗?我无法使用上面的示例进行复制。
-
与此同时,我已经解决了这个问题,但我会尝试整理一个简单的测试项目并在有机会时发布它。
-
没问题,我只是想知道我是否遗漏了什么=D
标签: wpf xaml mvvm combobox collectionviewsource