Привязка к элементам TreeView - PullRequest
1 голос
/ 16 января 2012

У меня есть treeView и панель стека с сообщением, что «нет элементов». Итак, я хочу скрыть панель, если элементы 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}}">

А вот метод конвертации моего конвертера:

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 Ответ

2 голосов
/ 16 января 2012

Экземпляр, хранящийся в 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>

(Видимость по умолчанию должна быть установлена ​​всеттер из-за приоритета свойства зависимости )

...