我的XAML代码中有一个ItemsControl。当一些触发器发生时,我想要折叠完整的itemsControl,所以所有的元素。
<ItemsControl Name="VideoViewControl" ItemsSource="{Binding Videos}">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<WrapPanel ItemHeight="120" ItemWidth="160" Name="wrapPanel1"/>
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate>
<DataTemplate>
<views:VideoInMenuView />
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
触发器:
<DataTrigger Value="videos" Binding="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type UserControl}, AncestorLevel=1}, Path=DataContext.VideosEnable}">
<Setter Property="ScrollViewer.Visibility" Value="Visible" TargetName="test1" />
<Setter Property="ScrollViewer.Visibility" Value="Collapsed" TargetName="test2" />
<Setter Property="WrapPanel.Visibility" Value="Collapsed" TargetName="wrapPanel1" />
</DataTrigger>
当我添加最后一个setter时,程序崩溃了。 没有这个最后的设定器,它工作正常,但没有可见性改变....
这段代码有什么问题?使用触发器折叠ItemsControl的所有元素的write方法是什么?
答案 0 :(得分:0)
如果你想隐藏整个ItemsControl,那么只需隐藏ItemsControl本身,而不是它的内部组件(ScrollViewer和WrapPanel):
<ItemsControl.Style>
<Style TargetType="ItemsControl">
<Style.Triggers>
<DataTrigger ...>
<Setter Property="Visibility" Value="Collapsed" />
</DataTrigger>
</Style.Triggers>
</Style>
</ItemsControl.Style>
这只会在ItemsControl本身上设置Visibility to Collapsed,听起来就像你想要的那样。
答案 1 :(得分:0)
我找到了解决方案:
我将其添加到itemscontrol的项目中:
Visibility="{Binding RelativeSource={RelativeSource Mode=FindAncestor,
AncestorType={x:Type ItemsControl}}, Path=Visibility, Mode=TwoWay}"
在WPF hittest算法中,我检查了visibility属性是否被绑定。
这不是一个很好的解决方案,但它对我有用....
很奇怪,如果你将itemscontrol的visibility属性设置为折叠,那么项目的visibility属性是可见的...... bug?
同样奇怪:最热门的人可以找到折叠的物品......