2014-02-20 63 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(「表格」),但沒有任何結果。

當我調用Tree.Items.Refresh()一切都很好,但我認爲這是不可能的或?

感謝每一個幫助 丹尼爾

回答

0

如果你想樹自我更新,那麼你別無選擇,只能在整個使用ObservableCollections。

您的RaisePropertyChanged("Sheets")被忽略,因爲WPF足夠聰明地比較對象引用以查看它是否真的發生了變化。你沒有提到你如何存儲表單集合,但是爲了使用手動屬性更改事件來查看任何更新,你必須將整個集合換出一個新集合。

+0

謝謝 我將嘗試使用ObservableCollection實現所有。 我認爲它是最簡單的(也許是唯一的)方法。 感謝您的幫助 – user3333428