我有一个treeView和一个stackpanel,上面写着“没有项目”的消息。所以,如果treeView的项目不为空,我想隐藏面板。
这是我的XAML示例:
<TreeView Name="treeDocs" Grid.ColumnSpan="2"/>
<StackPanel Orientation="Horizontal" VerticalAlignment="Top" HorizontalAlignment="Center"
Margin="51,20,51,0" Name="stkNoDocs"
Visibility="{Binding ElementName=treeDocs, Path=Items,
Converter={StaticResource ResourceKey=ItemsToVisibilityConverter}}">
这是我的Converter's Convert方法:
public object Convert(object value, Type targetType, object parameter,
System.Globalization.CultureInfo culture)
{
return ((ItemCollection)value).Count == 0 ? Visibility.Visible : Visibility.Collapsed;
}
我使用了Style属性:
<StackPanel.Style>
<Style TargetType="StackPanel">
<Setter Property="Visibility" Value="Visible"/>
<Style.Triggers>
<DataTrigger Binding="{Binding ElementName=treeDocs, Path=Items.Count}" Value="0">
<Setter Property="Visibility" Value="Hidden"/>
</DataTrigger>
</Style.Triggers>
</Style>
</StackPanel.Style>
在设计模式中,一切都很完美!但实际上面板总是可见的...问题是什么?
谢谢!
答案 0 :(得分:2)
存储在Items
中的实例永远不会更改(但它的集合内容会发生变化),因此绑定不会更新,绑定到Items.Count
并相应地更改转换器或使用Style
使用DataTrigger
比转换器更合适。
这样的事情:
<StackPanel.Style>
<Style TargetType="{x:Type StackPanel}">
<Setter Property="Visibility" Value="Collapsed"/>
<Style.Triggers>
<DataTrigger Binding="{Binding Items.Count, ElementName=treeDocs}"
Value="0">
<Setter Property="Visibility" Value="Visible"/>
</DataTrigger>
</Style.Triggers>
</Style>
</StackPanel.Style>
(由于dependency property precedence而需要在设置器中设置默认可见性)