2014-02-20 2 views
2

새로 워진 WPF에서 문제가 발생했습니다. 모델 용 GUI를 구현해야합니다. 이 모델에는 대괄호, 문서, 시트 및 이미지가 있습니다. 각 브래킷은 더 많은 브래킷이나 문서를 보관할 수 있습니다. 각 문서는 시트를 저장할 수 있습니다. 각 시트에는 이미지가 있습니다. 각 요소는 자식 요소를 목록에 보유합니다. 그래서 대괄호에 대괄호와 문서 목록이 있으며 문서 목록을 문서화합니다 ... 그래서이 구조체에 대해 HierarchicalDataTemplate이 있으며 작동합니다.목록이있는 WPF TreeView

하지만 이제 데이터를 편집하고 싶습니다 (일부 항목 이동 또는 삭제). 트리를 업데이트하는 방법을 모릅니다.

나는 지금 ObservableCollection과 루트 괄호 (이것들을 얻을 수있는 아무런 문제가 없기 때문에)를 사용하지만 각 괄호와 각 문서와 각 시트를 살펴보고 모든 목록을 만들고 싶다. ObservableCollection입니다.

시트 목록에서 변경 사항에 대해 트리에 통지 할 수 있습니까?

내보기 (안 중요한 것을 제외한 모든)

<DockPanel.Resources> 
    <HierarchicalDataTemplate DataType="{x:Type m:Bracket}" ItemsSource="{Binding Path=Items}"> 
     <TextBlock Text="{Binding Name}"></TextBlock> 
    </HierarchicalDataTemplate> 
    <HierarchicalDataTemplate DataType="{x:Type m:Document}" ItemsSource="{Binding Path=Sheets}"> 
     <TextBlock Text="{Binding Name}"></TextBlock> 
    </HierarchicalDataTemplate> 
    <HierarchicalDataTemplate DataType="{x:Type m:Sheet}" ItemsSource="{Binding Path=Images}"> 
     <TextBlock Text="{Binding Name}"></TextBlock> 
    </HierarchicalDataTemplate> 
    <HierarchicalDataTemplate DataType="{x:Type m:IPSImage}"> 
     <Image Source="{Binding ImageUri}" Width="150" Margin="0,5,0,0"></Image> 
    </HierarchicalDataTemplate> 
    </DockPanel.Resources> 

    <ToolBar DockPanel.Dock="Top"> 
    <Button Command="{Binding OpenAllCommand}">Alle Öffnen</Button> 
    <Button Command="{Binding MoveItemUpCommand}">Nach Oben</Button> 
    </ToolBar> 

    <TreeView ItemsSource="{Binding Path=Brackets}" Height="Auto" BorderThickness="0" DockPanel.Dock="Top" VerticalAlignment="Top"> 
    <TreeView.ItemContainerStyle> 
     <Style TargetType="TreeViewItem"> 
      <Setter Property="IsExpanded" Value="{Binding Path=DataContext.ExpandTreeViewItems, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type UserControl}}}" /> 
     </Style> 
    </TreeView.ItemContainerStyle> 
    <i:Interaction.Triggers> 
     <i:EventTrigger EventName="SelectedItemChanged"> 
      <cmd:EventToCommand Command="{Binding SelectedItemChangedCommand}" PassEventArgsToCommand="True"></cmd:EventToCommand> 
     </i:EventTrigger> 
    </i:Interaction.Triggers> 
    </TreeView> 

뷰 모델 :

// 각 브래킷은 새 문서를 생성하고 각 문서 생성자

private ObservableCollection<Bracket> m_Brackets; 
     public TreeViewModel() 
     { 
     m_Brackets = new ObservableCollection<Bracket>(); 
     m_Brackets.Add(new Bracket()); 
     if (m_Brackets[0] != null) 
     { 
      m_Brackets[0].Brackets.Add(new Bracket(m_Brackets[0].Id)); 
     } 
     m_Brackets.Add(new Bracket()); 
     } 

에 새 시트를 생성 그래서 m_Brackets/Documents에서 시트를 제거하면 아무 일도 일어나지 않습니다. RaisePropertyChanged ("Sheets")를 호출하려고하지만 아무 것도 호출하지 않습니다.

Tree.Items.Refresh()를 호출하면 모두 괜찮 으면하지만 그럴 가능성은 없습니까? 모든 도움말 다니엘

답변

0

에 대한

덕분에 당신은 다음에 걸쳐 ObservableCollections를 사용하는 선택의 여지가 있지만 나무가 자동으로 업데이트하십시오.

RaisePropertyChanged("Sheets")은 실제로 변경된 사항을 확인하기 위해 WPF가 개체 참조를 비교할만큼 똑똑하기 때문에 무시됩니다. 시트 등 컬렉션을 저장하는 방법은 언급하지 않지만 수동 속성 변경 이벤트를 사용하여 모든 업데이트를 보려면 새 컬렉션에 대해 전체 컬렉션을 스왑해야합니다.

+0

감사합니다. ObservableCollection으로 모두 구현하려고합니다. 나는 그것을하는 것이 가장 쉬운 방법 일 것이라고 생각한다. 도움 주셔서 감사합니다. – user3333428