使用CollectionViewSource会导致错误的Setter调用



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并将其作为属性暴露,问题得到了有效的解决。

最新更新