多绑定与多值转换器无法更新

11

看起来我的多绑定存在问题。

场景:
我有一个窗口,其中包含两个日期选择器和一个列表视图。 列表视图包含一些名为“条目”的数据绑定元素。 条目具有名为“日期”的属性。

我只想让我的列表视图显示日期在我的两个日期选择器日期之间的条目。

我用XAML代码将列表视图绑定到条目和日期:

<ListView.ItemsSource>
  <MultiBinding Converter="{StaticResource EntriesFilterConv}"
                UpdateSourceTrigger="PropertyChanged">
    <Binding Path="Entries" UpdateSourceTrigger="PropertyChanged"/>
    <Binding ElementName="EntryFromDate" Path="SelectedDate"
             UpdateSourceTrigger="PropertyChanged"/>
    <Binding ElementName="EntryToDate" Path="SelectedDate"
             UpdateSourceTrigger="PropertyChanged"/>
  </MultiBinding>
</ListView.ItemsSource>

然而,这并不起作用。我的转换器被调用了当一个SelectedDate改变时,但是当Entries改变时它从未被调用。

使用普通的数据绑定如下:

<ListView ItemsSource="{Binding Entries}">
  ...
</ListView>

列表视图正常更新。有什么想法?


我会移除所有的UpdateSourceTriggers,它们应该是多余的,因为“ListView”不会修改这些属性,因此源永远不会被更新。 - H.B.
谢谢,但这并没有帮助到我。 - Michael Hilus
3
我知道,这就是为什么我将它发布为评论的原因。 - H.B.
2个回答

13

在搜寻了几个小时之后,我找到了一个简单而不错的答案!由于ObservableCollection没有引发PropertyChanged事件,而是引发CollectionChanged事件,因此我们只需绑定集合的Count属性,以便在列表更改时触发事件:

<MultiBinding Converter="{Resources:ListToStringConverter}">
    <Binding Path="List.Count" />
    <Binding Path="List" />
</MultiBinding>

这个可以完美工作的多重绑定的原始信息在此处:https://dev59.com/KU3Sa4cB1Zd3GeqPxrxv#10884002


5
这不是推荐的做法,因为可能会导致内存泄漏,你可以在这里看到:链接。这种情况发生的原因是该属性不是一个依赖属性,并且没有实现INotifyPropertyChanged接口,所以WPF连接到该属性的唯一方式是使用PropertyDescriptor,它会附加一个PropertyChanged事件从而导致对该属性的硬引用。 - Carlos Teixeira
1
如果您的属性在视图模型中,当集合发生更改时(例如在setter中),您可以手动引发属性更改事件。 - Carlos Teixeira

6
我认为以下原因可能会导致这种情况:如果您直接绑定到 Entries,ListView 将监听 CollectionChanged 事件,但如果这样的绑定在 MultiBinding 中,则唯一可能引起重新评估的是 PropertyChanged 通知,在您的模型中 Entries 属性可能不存在此类通知。
也许您可以订阅集合的 CollectionChanged 事件并触发 PropertyChanged 事件,或者获取 MultiBinding 内的 BindingExpression 手动调用更新。

我会尝试。但是我应该使用哪个属性?有一个叫做this的属性吗? - Michael Hilus
你的模型是什么样子的?Entries 定义在哪里?如果您不熟悉,也可以查看 INotifyPropertyChanged 文档:http://msdn.microsoft.com/en-us/library/system.collections.specialized.inotifycollectionchanged.aspx - H.B.
我有一个通用类ViewModelCollection<T>, 继承自IList<T>, INotifyCollectionChangedINotifyPropertyChanged. 在这种情况下,Entries 是一个 ViewModelCollection<EntryViewModel>。 我可以在我的类中订阅 CollectionChanged 吗? - Michael Hilus
哦,也许你可以尝试使用Binding.IndexerName来提高PropertyChanged - H.B.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接