【问题标题】:WPF - Using CollectionViewSource is Causing Erroneous Setter CallWPF - 使用 CollectionViewSource 导致错误的 Setter 调用
【发布时间】: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


【解决方案1】:

显然,这是在从可视化树中删除 CollectionViewSource 时引起的...我将 CollectionViewSource 移动到 ViewModel 并将其作为属性公开,问题得到有效解决。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-25
    相关资源
    最近更新 更多