绑定TreeView的项目

时间:2012-01-15 22:28:12

标签: c# wpf xaml data-binding treeview

我有一个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>
  • 但结果仍然相同。

在设计模式中,一切都很完美!但实际上面板总是可见的...问题是什么?

谢谢!

1 个答案:

答案 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而需要在设置器中设置默认可见性)