C# 使用相同的ItemsSource跨多个DataTemplates进行多重绑定
我有两个数据模板,它们利用多重绑定来控制按钮的可见性,例如在数据模板a中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
<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 "/>