2010-05-31 118 views
0

我有一個列表,我綁定到一個TreeView。設置TreeView.DataContext的工作原理 - 一切正常顯示。然後我改變列表(向它添加一個項目)並再次設置TreeView.DataContext(到相同的值),但樹不會隨新項目一起刷新。我如何讓樹形視圖刷新?設置TreeView.DataContext不刷新樹

這基本上是我的代碼:

public class xItemCollection : ObservableCollection<xItem> 
{ 
} 

public class xItem : INotifyPropertyChanged 
{ 
    xItemCollection _Items; 
    string m_Text; 

    public xItem() 
    { 
     _Items = new xItemCollection(); 
    } 

    public xItemCollection Items {get{return _Items;}} 
    public string Text {get{return m_Text;} set{m_Text=value;}} 
} 

class MyProgram 
{ 
    xItem m_RootItem; 

    void UpdateTree() 
    { 
     this.RootItem = new xItem(); 
     treeView.DataContext = this; 
    } 

    public xItem RootItem 
    { 
     get { return m_RootItem;} 
     set { m_RootItem = value;} 
    } 
} 

的XAML是:

<TreeView Name="Tree" ItemsSource="{Binding Path=RootItem.Items}" > 

<TreeView.ItemTemplate> 
    <HierarchicalDataTemplate ItemsSource="{Binding Items}"> 
     <StackPanel Orientation="Horizontal"> 
      <TextBlock Text="{Binding Text}" /> 
     </StackPanel> 
    </HierarchicalDataTemplate> 
</TreeView.ItemTemplate> 
</TreeView> 

添加項目到列表中工作,直到樹呈現的第一次。渲染後,添加/刪除項目不刷新樹。

+0

什麼是你的代碼中的「this」?那麼XAML方面是怎樣的呢?你是否將你的hierarchicaldatatemplate設置爲正確的? – 2010-05-31 23:48:18

+0

也許RootItem必須是DependencyProperty? – 2010-06-02 23:06:13

+0

因此,在您的UpdateTree方法中,如果在末尾添加: RootItem.Items.Add(new xItem {Text =「new Subitem」}); 它不會顯示? – 2010-06-11 10:36:01

回答

4

如果您將相同的對象分配給datacontext,我想它不會觸發datacontext被更改。

你有一些選擇這裏:

  1. null分配到DataContext並重新分配你的列表,或撥打任何其他「令人耳目一新的命令」,得到您的DataContext刷新,這實際上是一個非常糟糕的主意,因爲你的整棵樹必須重新生長。

  2. 使用ObservableCollection作爲您的列表。如果您添加項目,這會自動觸發CollectionChanged事件,WPF用於僅更新列表的ChangedParts。

我肯定會推薦使用第二種方法!

+0

第一種方法有效。第二個不是。 第二,它仍然不刷新樹。我已將我的代碼添加到問題中。 – 2010-05-31 21:57:53

1

我需要實現INotifyPropertyChanged,然後在RootItem更改時觸發PropertyChanged。我的代碼正在創建一個新的項目列表,然後將完整列表分配給RootItem。如果沒有PropertyChanged,TreeView永遠不會知道RootItem已經改變。

+0

與你所說的代碼建立你不需要你的rootitem屬性changed。但不是創建一個新列表並將其分配給items屬性,清除它然後執行AddRange – 2010-06-14 23:25:58