0

問題がウェブで何度も議論されていることを知っていますか。しかし、私のものは特定のケースであり、私はまだ正しい解決策を見つけていません。

シナリオ:Silverlight 4-2つのHierarchicalDataTemplateによって表示されるデータを含むTreeView。1つは第1レベルのデータ(つまり、TreeViewの親アイテムのデータ)を表示し、もう1つは第2レベルのデータ(子の場合)を表示します。アイテム)。子アイテムテンプレートでは、コントロールの可視性を親テンプレートのデータソースクラスのプロパティにバインドする必要があります。

これは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の場合、次のように記述できます。

Visibility = "{Binding DataContext.Ori、Converter = {StaticResource rVisibilityConverter}、RelativeSource = {RelativeSource AncestorLevel = 2、AncestorType = {x:Type TreeViewItem}、Mode = FindAncestor}}"

...そしてそれは確かに機能します。ただし、Silverlightでは、RealitiveSourceを使用したバインディングモードとしてのFindAncestorがサポートされていないことを知っています。Webのソリューションは、ビジュアルツリーのコードビハインドで下にスクロールすることです。ビヘイビアで実現されているか、アタッチされたプロパティで実現されているかは関係ありません。解決策は次のとおりです。

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」は何もありません。スクロールするビジュアルツリーがありません

提案はありますか?前もって感謝します!ピレッギ

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ソリューションを使用したくない場合(子クラスに親の同じプロパティを追加するように強制する)、唯一の方法は、アプリケーションをSilverlight5にアップグレードすることです。 RelativeSourceでFindAncestorをサポートします。

Visibility = "{Binding DataContext.Ori、Converter = {StaticResource rVisibilityConverter}、RelativeSource = {RelativeSource AncestorLevel = 2、AncestorType = {x:Type TreeViewItem}、Mode = FindAncestor}}"

于 2012-02-03T12:04:56.267 に答える