在treeviewitem中绑定对子元素的可见性

时间:2014-04-01 09:31:09

标签: wpf user-interface binding

您好我尝试使用触发器绑定可见性,当图像对象为空时,应隐藏可见性。

<Style TargetType="{x:Type local:DirectoryTreeView}">
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type local:DirectoryTreeView}">
                    <Border Background="{TemplateBinding Background}"
                            BorderBrush="{TemplateBinding BorderBrush}"
                            BorderThickness="{TemplateBinding BorderThickness}">
                        <TreeView Name="PART_DirectoryTree">
                            <TreeView.ItemContainerStyle>
                                <Style TargetType="TreeViewItem">
                                    <Setter Property="IsExpanded" Value="{Binding StartExpanded}"></Setter>
                                    <Style.Triggers>
                                        <DataTrigger Binding="{Binding Path=Source, Source=Icon}">
                                            <Setter Property="Visibility" Value="Hidden"></Setter>
                                        </DataTrigger>
                                    </Style.Triggers>
                                </Style>
                            </TreeView.ItemContainerStyle>
                            <TreeView.ItemTemplate>
                                <HierarchicalDataTemplate ItemsSource="{Binding Children}">
                                    <StackPanel Orientation="Horizontal">
                                        <Image Name="Icon" Width="16" Height="16" Source="{Binding Image}"/>
                                        <TextBlock Text=" "></TextBlock>
                                        <TextBlock Text="{Binding HeaderText}"></TextBlock>
                                    </StackPanel>
                                </HierarchicalDataTemplate>
                            </TreeView.ItemTemplate>
                        </TreeView>
                    </Border>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>

到目前为止,我已尝试过触发器和数据触发器,这是我第一次尝试在datatrigger的setter上使用targetname属性,但后来我遇到了编译器错误。

不工作==&gt;

<datatrigger binding={binding Image}>
   <setter targetname="Icon" property="Visibility" value="Hidden"/>
</datatrigger>

任何人都可以告诉我这种绑定是如何正确完成的?

2 个答案:

答案 0 :(得分:2)

如果来源 null ,您可以创建默认Image并使用TargetNullValue

<BitmapImage x:Key="ErrorImage" UriSource="Images/Error.png" />

<Image Source="{Binding Path=Image,
                        TargetNullValue={StaticResource ErrorImage}}" />

如果您接近它,它将比转换器更容易使用。

答案 1 :(得分:1)

我使用完全不同的方法解决了这个问题,在图像上使用了值转换器。

public class VisibilityConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        var hiddenType = parameter.ToString().ToLowerInvariant() == "collapsed"
            ? Visibility.Collapsed
            : Visibility.Hidden;
        return value == null ? hiddenType : Visibility.Visible;
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new Exception("Cannot convert back from visibility to object.");
    }
}

因为我似乎没有找到一种可行的方式来按照我想要的方式进行绑定,(可能它不是那个意思)这是一个很好的解决方案。

<Image Visibility="{Binding Image,ConverterParameter=Collapsed, Converter={StaticResource VisibilityConverter}}" Width="16" Height="16" Source="{Binding Image}"/>