WPF, MVVM
我发现,如果我使用CollectionViewSource与我的ComboBox,当我关闭窗口,一个额外的调用SelectedValue Setter正在执行,如果SelectedValue被绑定到一个字符串属性。如果我将ItemsSource绑定直接设置到VM,则不会发生此调用。额外的调用会导致VM中的值发生变化,从而导致不正确的数据。我有其他的组合框设置相同的方式,但他们绑定到整数值。
CollectionViewSource定义:
<CollectionViewSource x:Key="AllClientsSource" Source="{Binding AllClients}" >
<CollectionViewSource.SortDescriptions>
<scm:SortDescription PropertyName="ClientName" />
</CollectionViewSource.SortDescriptions>
</CollectionViewSource>
ComboBox with 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}}" />
谁能告诉我为什么有一个额外的setter调用使用CollectionViewSource?字符串绑定有什么不同?是否有一种方法可以正确地绕过它?
编辑:我试着改变它,并在组合框上使用SelectItem属性。相同的结果。因此,如果项是标量数据类型,它似乎可以按预期工作。如果它是一个对象,你会得到一个额外的setter调用,带有一个空值。同样,如果我从方程中删除CollectionViewSource,它会像预期的那样工作。再次编辑:我添加了一个示例项目的链接来说明这个问题。目标。net 4.5.
- 点击显示View One
- 选择客户端,右侧显示客户端名称。
- 点击显示视图二
- 返回到View One -注意,选中的客户端不再被选中。
- 点击显示视图三
- 选择区域,右侧显示区域名称。
- 返回视图二
- 返回到视图三-注意所选区域仍然是选中的。
视图之间的唯一区别是视图1和视图2使用CollectionViewSource。Three直接绑定到ViewModel。当您从One或Two移动到新选项卡时,所选项的setter将以空值调用。为什么?最好的变通办法是什么?
谢谢。
显然,这是由于当CollectionViewSource从视觉树中删除…我将CollectionViewSource移动到ViewModel并将其作为属性暴露,问题得到了有效的解决。