0

你知道吗?这个问题在网上已经讨论过很多次了。但我的是一个特例,我仍然没有找到正确的解决方案。

场景:Silverlight 4 - 一个 TreeView,其数据由两个 HierarchicalDataTemplate 显示,一个显示第一级数据(即 TreeView 的父项的数据),一个显示第二级数据(用于子项的数据)项目)。在子项模板中,我必须将控件的可见性绑定到父模板的数据源类的属性。

这是 XAML 代码:

<UserControl.Resources>
    <HierarchicalDataTemplate x:Key="modTreeArtDataParts2">
        <Grid>
            <TextBlock
                Visibility="{Binding ???}"/>
        </Grid>
    </HierarchicalDataTemplate>

    <HierarchicalDataTemplate x:Key="modTreeArtDataParts"
        ItemTemplate = "{StaticResource modTreeArtDataParts2}"
        ItemsSource = "{Binding RicambiItemList}">

    </HierarchicalDataTemplate>
</UserControl.Resources>

<Grid>
    <TreeView
        ItemTemplate = "{StaticResource modTreeArtDataParts}"
        ItemsSource="{Binding RicambiList}"/>
</Grid>

如果是 WPF,我可以写:

可见性 =“{Binding DataContext.Ori, Converter={StaticResource rVisibilityConverter}, RelativeSource={RelativeSource AncestorLevel=2, AncestorType={x:Type TreeViewItem}, Mode=FindAncestor}}”

......它肯定会奏效。但我知道在 Silverlight FindAncestor as binding-mode with RealitiveSource is not supported中。网络中的解决方案都围绕在可视化树的代码隐藏中向下滚动。它是通过 Behavior 还是通过 Attached-Propery 实现的并不重要。解决方案是这样的:

Public Class hideTextBlockBehavior
    Inherits Behavior(Of DependencyObject)

    Protected Overrides Sub OnAttached()
        MyBase.OnAttached()
        Dim g As Grid = FindVisualParent(Of Grid)(AssociatedObject)
        Dim o As customType = g.DataContext
        If o.hide Then AssociatedObject.Visibility = Visibility.Collapsed
    End Sub

    Private Function FindVisualParent(Of parentItem As DependencyObject)(ByVal obj As DependencyObject) As parentItem
        Dim objParent As DependencyObject = obj
        While obj Is Nothing = False AndAlso TypeOf obj Is parentItem = False
            obj = VisualTreeHelper.GetParent(obj)
        End While
        Return DirectCast(obj, parentItem)
    End Function
End Class

<HierarchicalDataTemplate x:Key="modTreeArtDataParts2">
    <Grid>
        <TextBlock>
            <i:Interaction.Behaviors>
                <il:hideTextBlockBehavior/>
            </i:Interaction.Behaviors>
        </TextBlock>
    </Grid>
</HierarchicalDataTemplate>

我多次使用这样的解决方案,它们总是有效的。但是在这种情况下,我的 DataTemplate嵌套到另一个 DataTemplate 中,然后,当我在“OnAttached”方法中时,“AssociatedObject”的属性“Parent”什么都没有,然后我没有 Visual-Tree to scroll

你有什么建议吗?先感谢您!皮莱吉

4

2 回答 2

1

我的建议是将您的父视图模型的引用传递给正在构建的孩子:

var itemVm = new ItemViewModel()
{
    Description = "Parent", ChildVisibility = "Collapsed"
}
itemVm.Children = new List<ChildItemViewModel>
{
    new ChildItemViewModel()
    {
        ParentVm = itemVm;
        Description = "Child"
    }
}

通过这样做,您可以轻松地绑定到父视图模型上的属性,如下所示:

<TextBlock Visibility="{Binding ParentVM.ChildVisibility}"/>
于 2012-02-02T22:54:33.997 回答
0

如果您不想使用 eric 解决方案(强制您在子类中添加父级的相同属性),我想您可以采取的唯一方法是将您的应用程序升级到 Silverlight 5,即使用 RelativeSource 支持 FindAncestor:

可见性 =“{Binding DataContext.Ori, Converter={StaticResource rVisibilityConverter}, RelativeSource={RelativeSource AncestorLevel=2, AncestorType={x:Type TreeViewItem}, Mode=FindAncestor}}”

于 2012-02-03T12:04:56.267 回答