2010-05-30 46 views
4

我有一個定義良好的樹存儲庫。我可以在哪裏重命名項目,將它們向上,向下移動等。添加新的和刪除。WPF樹數據綁定模型和存儲庫

的數據被存儲在一個表,如下所示:

Index Parent Label Left Right 
1  0  root  1  14 
2  1  food  2  7 
3  2  cake  3  4 
4  2  pie  5  6 
5  1  flowers 8  13 
6  5  roses 9  10 
7  5  violets 11  12 

代表下面的樹:

     (1) root (14) 
     (2) food (7)     (8) flowers (13) 
    (3) cake (4) (5) pie (6) (9) roeses (10) (11) violets (12) 

,並直觀地顯示如下:

root 
    food 
    cake 
    pie 
    flowers 
    roses 
    violets 

現在,我的問題是如何以一種可綁定的方式表示這一點,以便TreeView可以處理所有可能的數據更改? 重命名很簡單,我所需要的只是使標籤成爲可更新的字段。但是如果用戶將鮮花移到食物上方呢?我可以對相關數據進行更改,但會導致樹中所有其他項的完整數據更改。而且我發現的可綁定層次結構的所有示例都適用於非靜態樹。

所以我當前的(和壞的)解決方案是在重定位更改後重新加載顯示的樹。

任何方向都不錯。

感謝

回答

0

不要使用TreeView使用第三方圖形控制。一個簡短的谷歌搜索提出了幾個網站,檢查出這個例如GoSilverlightDemo檢查OrgChartEditor示例,您可以拖動節點並更改鏈接。

+0

不錯的控制,但這是一個開源項目。所以我不能使用它 – Amirshk 2010-05-30 14:00:48

2

您是否嘗試過使用一個相當簡單的結構,包括子節點的ObservableCollection <>?

interface ITreeNode<T> 
    where T : ITreeNode 
{ 
    string Name { get; set; } 
    ObservableCollection<T> Children { get; } 
} 

然後你可以使用一個HeirarchicalDataTemplate你TreeView的XAML:將實現該接口的東西

<TreeView ItemsSource="{Binding MyTree}"> 
    <TreeView.ItemTemplate> 
     <HierarchicalDataTemplate ItemsSource="{Binding Children}"> 
      <TextBlock Text="{Binding Name}"/> 
     </HierarchicalDataTemplate> 
    </TreeView.ItemTemplate> 
</TreeView> 

你必須制定出拖動和放下了你自己,而是應該讓你開始展示一切。

我剛剛不得不做上面我自己,這CodeProject上的文章幫我,如果你需要任何更多:http://www.codeproject.com/KB/WPF/TreeViewWithViewModel.aspx

更新:
既然你現在有一個表格式的一切,我假設你不想修改你的默認數據結構,使用IValueConverter來獲取你想要的項目。此代碼是未經測試,但我想嘗試類似如下的內容:

{Binding Index, Converter={StaticResource myConverter}} 

當你聲明myConverter,把它給你的表格數據的參考。使用索引作爲值並引用表,您可以從convert方法返回IEnumerable並顯示相應的結果。

讓我知道你是否需要更多的細節。