2011-04-07 27 views
6

似乎我有一个多重绑定的问题。MultiBinding MultiValueConverter不更新

场景:
我有一个窗口有两个datepickers和一个listview。 listliew包含一些称为“条目”的数据绑定元素。一个条目有一个名为“日期”的属性。

我只想让我的列表视图显示日期在两个日期选择日期之间的条目。为ListView结合的项目和日期

我的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更改时调用,但当条目更改时从不调用。

与正常数据这样结合:

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

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

+0

我将删除所有UpdateSourceTriggers,它们应该是多余的,因为'ListView'不会修改这些属性,因此源永远不会被更新。 – 2011-04-07 15:53:04

+0

谢谢,但这并没有帮助。 – 2011-04-07 15:56:29

+1

我知道,这就是为什么我发布它作为评论。 – 2011-04-07 15:57:39

回答

4

我觉得有以下可能导致这样的:如果你直接绑定到Entries ListView控件会听CollectionChanged事件,但如果这样的结合是一个MultiBinding内会导致重新评估可能是一个PropertyChanged通知的唯一的事情,这可能不适用于模型中的Entries属性。

也许你可以订阅CollectionChanged事件您的收藏和养PropertyChanged事件或让你MultiBindingBindingExpression手动调用更新。

+0

我会尽力的。但我应该使用什么财产?有一种叫做'this'的属性吗? – 2011-04-07 16:34:29

+0

你的模型是什么样的? “条目”在哪里定义?如果您不熟悉该文档,还可以查看INotifyPropertyChanged文档:http://msdn.microsoft.com/zh-cn/library/system.collections.specialized.inotifycollectionchanged.aspx – 2011-04-07 16:39:17

+0

我有一个通用类'ViewModelCollection '从IList ','INotifyCollectionChanged'和'INotifyPropertyChanged'继承。在这种情况下,'Entries'是一个'ViewModelCollection '。我可以在我的课堂内订阅“CollectionChanged”吗? – 2011-04-07 16:45:07

8

找了几个小时后,我找到了一个简单而体面的答案! 由于的ObservableCollection不会引发PropertyChanged事件,但CollectionChanged,我们只需要绑定集合的Count触发事件时,列表中的变化:

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

这个原始的相关信息完美的工作multibinding这里:https://stackoverflow.com/a/10884002/817504

+5

这是不推荐的,因为它可能会导致内存泄漏,你可以看到这里: [链接](https://support.microsoft.com/en-us/kb/938416)。 它发生的原因是该属性不是一个依赖项属性,并且不实现INotifyPropertyChanged,所以WPF必须“绑定”到该属性的唯一方法是使用PropertyDescriptor,该属性附加一个PropertyChanged事件,导致对该属性的硬引用。 – 2016-08-10 11:16:13

+0

有趣的是,thx,那么什么是正确的解决方案? – Profet 2016-08-12 12:41:28

+1

如果您的视图模型中有属性,则可以在集合更改时手动引发属性已更改的事件(例如,在setter中)。 – 2016-08-25 06:33:29