【问题标题】:MultiBinding with MultiValueConverter does not update使用 MultiValueConverter 的 MultiBinding 不会更新
【发布时间】:2011-04-07 15:45:01
【问题描述】:

我的多重绑定似乎有问题。

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

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

我用于将列表视图绑定到条目和日期的 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 不会修改这些属性,因此源永远不会被更新。
  • 谢谢,但这没有帮助。
  • 我知道,这就是我将其作为评论发布的原因。

标签: wpf xaml data-binding


【解决方案1】:

搜索了几个小时后,我找到了一个简单而体面的答案! 由于 ObservableCollection 不会引发 PropertyChanged 事件而是 CollectionChanged,我们只需绑定集合的 Count 以在列表更改时触发事件:

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

关于这个完美工作的多重绑定的原始信息:https://stackoverflow.com/a/10884002/817504

【讨论】:

  • 不推荐这样做,因为它可能会导致内存泄漏,如您在此处看到的:Link。发生这种情况是因为该属性不是依赖属性并且没有实现 INotifyPropertyChanged,因此 WPF 必须“绑定”到该属性的唯一方法是使用 PropertyDescriptor,它附加一个 PropertyChanged 事件,导致对该属性的硬引用。
  • 如果您的属性在视图模型中,您可以在集合更改时手动引发属性更改事件(例如在设置器中)。
【解决方案2】:

我认为以下可能会导致这种情况:如果您直接绑定到 Entries,ListView 将侦听 CollectionChanged 事件,但如果这样的绑定在 MultiBinding 内,则唯一会导致重新评估的事情可能是 PropertyChanged 通知,您的模型中的 Entries 属性可能不存在该通知。

也许您可以订阅您收藏的CollectionChanged 事件并引发PropertyChanged 事件或在您的MultiBinding 中获取BindingExpression 以手动调用更新。

【讨论】:

  • 我会试试的。但是我应该使用什么属性?有没有叫this的属性?
  • 你的模型是什么样的? Entries 在哪里定义?如果您不熟悉,还可以查看 INotifyPropertyChanged 文档:msdn.microsoft.com/en-us/library/…
  • 我有一个泛型类ViewModelCollection&lt;T&gt;,它继承自IList&lt;T&gt;INotifyCollectionChangedINotifyPropertyChanged。在这种情况下,EntriesViewModelCollection&lt;EntryViewModel&gt;。我可以在课堂上订阅CollectionChanged 吗?
  • 哦,也许你可以尝试使用Binding.IndexerName 提升 PropertyChanged。
猜你喜欢
  • 2019-12-23
  • 2012-07-10
  • 2018-12-08
  • 1970-01-01
  • 2014-05-01
  • 2018-08-03
  • 1970-01-01
  • 1970-01-01
  • 2021-02-12
相关资源
最近更新 更多