【发布时间】:2014-03-07 18:45:13
【问题描述】:
我已经为我的 Component 对象创建了一个 DataTemplate。我添加了 DataTrigger 以确定组件是否应该可见。本质上,我们有过滤器,代码检查这些过滤器以确定组件应该是可见的还是折叠的。我遇到的问题是我希望触发器将可见性设置为父容器的“折叠”或“可见”,即 ListBoxItem。该代码有效,但将其设置在 Border 处。
模板的开头是这样的:
<DataTemplate DataType="{x:Type local:Component}">
<Border .....
我正在为我的触发器提供代码,我将在下面解释我尝试了哪些但没有成功。
<DataTemplate.Triggers>
<DataTrigger Value="True">
<DataTrigger.Binding>
<MultiBinding Converter="{StaticResource TrueWhenComponentIsVisible}">
<Binding Path="Type" />
<Binding Path="Dependency"/>
<Binding Path="SelectedType" RelativeSource="{RelativeSource FindAncestor, AncestorType=Window}"/>
<Binding Path="SelectedDepencency" RelativeSource="{RelativeSource FindAncestor, AncestorType=Window}"/>
</MultiBinding>
</DataTrigger.Binding>
<DataTrigger.Setters>
<Setter Property="Visibility" Value="Visible"></Setter>
</DataTrigger.Setters>
</DataTrigger>
<DataTrigger Value="False">
<DataTrigger.Binding>
<MultiBinding Converter="{StaticResource TrueWhenComponentIsVisible}">
<Binding Path="Type" />
<Binding Path="Dependency"/>
<Binding Path="SelectedType" RelativeSource="{RelativeSource FindAncestor, AncestorType=Window}"/>
<Binding Path="SelectedDepencency" RelativeSource="{RelativeSource FindAncestor, AncestorType=Window}"/>
</MultiBinding>
</DataTrigger.Binding>
<DataTrigger.Setters>
<Setter Property="Visibility" Value="Collapsed"></Setter>
</DataTrigger.Setters>
</DataTrigger>
</DataTemplate.Triggers>
</DataTemplate>
对于 Setter 属性
<Setter Property="Visibility" Value="Collapsed"></Setter>
我尝试使用绑定来获取列表框项,如下所示:
<Setter Property="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType=ListBoxItem}, Path=Visibility}" Value="Collapsed"></Setter>
当我尝试运行它时出现此错误,所以我认为我根本不能在那里使用绑定并需要不同的方法?
A 'Binding' cannot be set on the 'Property' property of type 'Setter'. A 'Binding' can only be set on a DependencyProperty of a DependencyObject
【问题讨论】:
-
我建议调查
ListCollectionView。然后您的ListBox可以使用视图作为源并在后面的代码中指定过滤器。尝试在 xaml 级别执行此操作要干净得多。 -
在边界设置可见性有什么问题?
-
据我所知,
Binding在Setter.Property中不起作用。您必须在属性中指定静态值。 -
说
<Setter Property="Visibility" Value="Collapsed">相当于说myItem.Visibility = Visibility.Collapsed。您不能像这样对Visibility属性使用绑定。 -
嗨朱利安,我完全同意你的看法。我使用 XAML 的原因是它是类别和组件的递归列表,而 datatrigger 似乎是一种更好的方法,但我最终可能会在后面的代码中进行过滤。
标签: wpf binding listboxitem multidatatrigger