C# 使用相同的ItemsSource跨多个DataTemplates进行多重绑定

C# 使用相同的ItemsSource跨多个DataTemplates进行多重绑定,c#,wpf,data-binding,C#,Wpf,Data Binding,我有两个数据模板,它们利用多重绑定来控制按钮的可见性,例如在数据模板a中 <Button.Visibility> <MultiBinding Converter="{StaticResource HideFirstOrderedItemConverter}" Mode="TwoWay"> <Binding RelativeSource="{RelativeSource FindAncestor, AncestorType={x:Type L

我有两个数据模板,它们利用多重绑定来控制按钮的可见性,例如在数据模板a中

<Button.Visibility>
    <MultiBinding Converter="{StaticResource HideFirstOrderedItemConverter}" Mode="TwoWay">
         <Binding RelativeSource="{RelativeSource FindAncestor, AncestorType={x:Type ListBox}}" Path="Items"/>
         <Binding Path="Entity"/>
    </MultiBinding>
</Button.Visibility>
当我向集合中添加项时,我的转换器会被命中,但仅针对与刚刚添加的项关联的数据模板。我希望所有项目都能成功

更新:

下面来自@ASh和@GazTheDestroyer的评论有助于我的理解。我需要使用属性更改事件通知我的集合更改事件视图(集合更改事件不会出现在绑定框架中)。因此,通过将我的XAML更新为

<Button.Visibility>
    <MultiBinding Converter="{StaticResource HideFirstOrderedItemConverter}" Mode="TwoWay">
         <Binding RelativeSource="{RelativeSource FindAncestor, AncestorType={x:Type ListBox}}" Path="DataContext.Entities"/>
         <Binding Path="Entity"/>
    </MultiBinding>
</Button.Visibility>
其中,
CollectionChanged
回调在
Entities
ObservableCollection上引发notify property changed事件。我相信这就是解决问题的方法(最好将这种行为抽象为它自己的类型)

如果对
实体
的绑定发生更改,或者
实体
都必须更改,wpf是否会触发
多绑定
转换器HIDEFIRSTORDEDEREDEMCONVERTER

要么。问题在于,在源集合中添加或删除项时,
ListBox
Items
属性未设置。绑定到
项。改为计数

<Binding RelativeSource="{RelativeSource FindAncestor, AncestorType={x:Type ListBox}}"
         Path="Items.Count "/>

在源集合中添加或删除项时,此属性将更改


还要注意,您的
实体
属性必须引发
属性更改
事件,以便在设置转换器时重新调用它。

添加和删除了项的ObservableCollection!=项目属性更改。属性不更改,引用保持不变。当包含的任何绑定发生更改时,多绑定会更新,但此处没有任何更改我有点困惑,因为文档中说“代表一个动态数据收集,在添加、删除项目时提供通知”()是否需要绑定到
项目集合
中的
项目
的其他内容?INotifyCollectionChanged会通知添加/删除。您的绑定只是通过INotifyPropertyChanged监视实例的更改,而您的实例永远不会更改。作为一个黑客补丁,你可以添加第三个绑定到条目。当添加/删除某些内容时,计算哪些应该触发你的转换器是的-我很快就学会了。我可以在CollectionChanged事件中添加另一个属性,或者在视图模型中添加钩子,并在基础集合上引发更改的属性,前提是我更新xaml以指向
Path=DataContext.MyObservableCollection
,而不是
Path=Items
。不确定哪一个更好。但这不会为我的转换器提供一个
int
,而不是我的转换器所需的源项列表吗?我可以添加它作为一个附加绑定,这样它就启动了,但是没有权利将一个值注入我不打算使用的转换器。是的,它将提供一个
int
。是的,如果您需要对转换器中集合的引用,您应该向
添加另一个绑定。如果感觉不“对”,转换器就不是你想要的。
<Button.Visibility>
    <MultiBinding Converter="{StaticResource HideFirstOrderedItemConverter}" Mode="TwoWay">
         <Binding RelativeSource="{RelativeSource FindAncestor, AncestorType={x:Type ListBox}}" Path="DataContext.Entities"/>
         <Binding Path="Entity"/>
    </MultiBinding>
</Button.Visibility>
Entities.CollectionChanged += CollectionChanged
<Binding RelativeSource="{RelativeSource FindAncestor, AncestorType={x:Type ListBox}}"
         Path="Items.Count "/>