2010-01-26 21 views
8

Maalesef kök düğümlerin güncellemiyor ObservableCollection bağlı - benim sorum this one neredeyse aynı ama uygulanabilir bir cevap almadığından, başkası bazı taze fikirleri olduğunu umuyorum. WPF TreeView

Tek tip bir hiyerarşiye bağlı bir WPF TreeView var:

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

Varlık sınıfı INotifyPropertyChanged uygular, ama netlik için bu kodu atladık.

TreeView Bir ObservableCollection < Varlık> ve her Varlık örneğine bağlı olan Çocuk özelliği aracılığıyla bulunan Varlık örnekleri kümesi gösterir:

<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> 

Başlangıçta TreeView beklendiği gibi bağlanır ve doğru olarak bir çok düzeyli görüntüler hiyerarşi. Ayrıca, Çocuk koleksiyonlarından birinin üyeliği programlı olarak değiştirildiğinde, değişiklikler TreeView'e doğru şekilde yansıtılır.

Ancak kök üyesi seviyesinin üyeliğine değişiklikler < Varlık> TreeView yansıtılmaz ObservableCollection.

Herhangi bir öneri takdir edilecektir. yerine aşağıdaki gibi bir şey [iyi] yapmanın, Sonra

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

:

cevap

19

Benim ilk tahminim kök düğüm için aşağıdaki gibi bir şey olması

sayesinde Tim

Entities.Clear(); 
foreach (var item in someSetOfItems) 
    Entities.Add(item); 
böyle [kötü] bir şey yapıyorsun

:

Entities = new ObservableCollection<Entity>(someSetOfItems); 

Sen Varlıkları mülkiyet readonly ait arka alanını yaparak sorunu izini gerekir:

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

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

Teşekkür - parlak bir analiz! –

+1

Vay, bu benim için çalıştı. Bu değişiklik neden işe yarıyor? –

+3

@Mike [Bad] örneğinde yeni bir varlık yaratıyor, böylece orijinali ciltlemeyi kırıyor. [İyi] örnekte, sadece öğeleri temizler ve ekleyerek orijinal koleksiyonu korur. –

2

ayrıntılı açıklama, cevap gelmesi için uzun zaman, ama bunu yaparsanız bağlama inanıyoruz XAML ve sonra kodda size bağlayıcı kırmak özelliğine yeni bir nesne atamak, yani o iş için kod bağlama yinelemek zorunda kalacaktı. Bundan dolayı, salt arka destek alanı ile çözüm. Eğer yeni bir ObservableCollection atamak mümkün olmayacaktır ve arka alanına yeni bir nesne atayarak bağlayıcı kırmayacak böyle yapıyor edin.