2010-01-26 47 views
8

對不起 - 我的問題幾乎與this one相同,但由於它沒有收到可行的答案,我希望別人有一些新的想法。WPF TreeView綁定到ObservableCollection不更新根節點

我具有被綁定到單個類型的層次結構的樹視圖WPF:

public class Entity 
{ 
    public string Title { get; set; } 
    public ObservableCollection<Entity> Children { get; set; } 
} 

實體類實現INotifyPropertyChanged,但我已經爲了清楚省略了該代碼。

樹視圖綁定到一個ObservableCollection <實體>並且每個實體例如經由其Children屬性公開了一組包含的實體的實例:

<TreeView ItemsSource="{Binding Path=Entities}"> 
    <TreeView.Resources> 
     <HierarchicalDataTemplate DataType="{x:Type local:Entity}" ItemsSource="{Binding Path=Children}"> 
      <TextBlock Text="{Binding Path=Title}" /> 
     </HierarchicalDataTemplate> 
    </TreeView.Resources> 
</TreeView> 

最初TreeView的結合如預期和正確地顯示了多層次的層次結構。此外,當其中一個Children集合的成員身份以編程方式修改時,這些更改將正確地反映在TreeView中。

但是,根成員級別ObservableCollection < Entity>的成員資格更改未反映在TreeView中。

任何建議,將不勝感激。

感謝, 添

回答

19

我最初的猜測是,你有什麼樣的根節點以下幾點:

public ObservableCollection<Entity> Entities 
{ 
    get; 
    set; 
} 

,而不是做一些[好]像下面然後:

Entities.Clear(); 
foreach (var item in someSetOfItems) 
    Entities.Add(item); 

你正在做的事情[衰]是這樣的:

Entities = new ObservableCollection<Entity>(someSetOfItems); 

您應該能夠通過使實體財產readonly的支持字段追查問題:

private readonly ObservableCollection<Entity> _entities 
    = new ObservableCollection<Entity>(); 

public ObservableCollection<Entity> Entities 
{ 
    get 
    { 
     return _entities; 
    } 
} 
+0

謝謝 - 一個輝煌的分析! – 2010-01-26 12:29:08

+1

哇,這對我有用。爲什麼這種改變會起作用? – 2010-12-09 14:19:20

+3

@Mike在[壞]例子中,他正在創建一個新的實體,從而打破了與原始的綁定。在[良好]例子中,他只是清理並添加項目,但保留原始集合。 – 2012-04-03 08:31:29

2

進一步解釋,時間長了答案來,但我相信,如果你做的結合在XAML中,然後在代碼中爲該屬性分配一個新對象,以便中斷綁定,因此您必須重做代碼中的綁定才能起作用。因此解決方案只有readonly支持領域。如果這樣做,您將無法分配新的ObservableCollection,並且您不會通過將新對象分配給後臺字段來中斷綁定。