0

문제가 여러 번 웹에서 논의 된 것을 알고 있습니다. 그러나 내 경우는 특별한 경우이며 올바른 해결책을 찾지 못했습니다.DataTemplate이 다른 Datatemplate에 중첩되어 있으면 father-template 속성과의 바인딩이 어렵습니다.

시나리오 : Silverlight 4 - 두 개의 HierarchicalDataTemplate이 보여주는 데이터가있는 TreeView, 첫 번째 수준의 데이터 (예 : TreeView의 아버지 항목 데이터) 및 두 번째 수준의 데이터를 표시하는 TreeView 어린이 용품). 하위 항목 템플릿에서 컨트롤의 가시성을 아버지 템플릿의 데이터 소스 클래스의 속성에 바인딩해야합니다. 이 WPF라면

<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> 

내가 작성할 수 있습니다 : = "{DataContext.Ori, 컨버터 = {정적 리소스 rVisibilityConverter}, RelativeSource = {RelativeSource AncestorLevel 바인딩

가시성

는 XAML 코드 = 2, AncestorType = {x : Type TreeViewItem}, Mode = FindAncestor}} "

... 확실히 작동합니다. 하지만 Silverlight에서 RealAudio를 사용하는 바인딩 모드 인 FindAncestor는 지원되지 않습니다.. 웹상의 솔루션은 시각적 트리의 코드 숨김으로 아래로 스크롤하여 주위에 있습니다. 그것은 행동이나 첨부 된 성취와 함께 실현되는지 여부는 중요하지 않습니다. 해결책은 다음과 같습니다 :

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"가 아무 것도 아닌데 스크롤 할 시각적 트리가 없습니다 .

의견이 있으십니까? 미리 감사드립니다. PILEGGI

답변

1

나의 제안은 건설의 아이들에게 부모 뷰 모델에 대한 참조를 통과하는 것입니다 : 당신은 쉽게과 같이 상위 뷰 모델의 속성에 바인딩 할 수 있습니다이를 통해

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

을 : 당신이 (자식 클래스에서 부모의 같은 속성을 추가하도록 강요 taht를) 에릭 솔루션, 유일한 방법을 사용하지 않으려면

<TextBlock Visibility="{Binding ParentVM.ChildVisibility}"/> 
+0

그래, 생각해 봤어.하지만 조금 중복 된 거지? – lamarmora

+0

Silverlight의 단점 (WPF의 풍부함에 반대)에 대한 대부분의 해결 방법이 유사한 구문으로 이어질 것이라고 생각하지만 다소 중복됩니다. 개인적으로, 나는 커스텀 코드에서 비주얼 트리를 순식간에 순회하는 것을 발견했다. Silverlight 5로 업그레이드하거나 변환기를 사용하는 것은 다른 옵션입니다. 뷰 모델 검색기 서비스를 사용하는 경우 참조없이 이동할 수도 있습니다. – ericontilt

0

, 나는 가정, 당신이 취할 수에있다 FindAnces를 지원하는 Silverlight 5로 응용 프로그램 업그레이드 토르 RelativeSource와 : =

가시성 "{DataContext.Ori, 컨버터 = {정적 리소스 rVisibilityConverter을} 바인딩, RelativeSource = {RelativeSource AncestorLevel = 2, AncestorType = {X : 유형 TreeViewItem}, 모드 = FindAncestor}}"

관련 문제