2011-09-21 71 views
1

我在WPF中實現了一個TreeView,它通過XElement類綁定到某些XML數據。第一次裝入XML文件時,綁定工作正常。所有數據按預期填充樹。當我添加和刪除元素時會發生問題,因爲TreeView中沒有任何事情發生。現在我已經做到了這一點',我相信我記得不必爲這項工作做任何額外的工作。至少對於從樹中添加和移除項目的簡單情況而言。我記得很驚訝,這沒有任何額外的編碼工作。我再也無法訪問該代碼,因此我不能只看看我已經做了什麼。所以我有點爲難,爲什麼我現在無法讓這個工作。通過XElement處理數據綁定XML數據的TreeView更新問題

我的WPF代碼如下。

<Window.Resources> 
    <HierarchicalDataTemplate ItemsSource="{Binding Path=Elements}" x:Key="ViewEditTreeTemplate"> 
     <StackPanel Orientation="Horizontal" Margin="2"> 
      <Label x:Name="ElementHeaderLabel" Padding="1" VerticalContentAlignment="Center" FontSize="16" Content="{Binding Path=DisplayName}" /> 
     </StackPanel> 
    </HierarchicalDataTemplate> 
</Window.Resources> 


<Grid> 
    <TreeView Name="DataTree" ItemTemplate ="{Binding Source={StaticResource ViewEditTreeTemplate}}" Margin="0,0,0,53" /> 
</Grid> 

我附加在後面的代碼如下我的XML文檔。請記住,由於樹自動填充來自XML數據的信息就好了,因此這看起來很有效。

XElement NewElement = new XElement(XElement.Load(FilePath)); 
List<XElement> TempList = new List<XElement>(); 
TempList.Add(NewElement); 
DataTree.ItemsSource = TempList; 

在當我去添加或刪除元素後面的代碼我做如下:

// When removing an element 
Element.Remove();   //Element is of type XElement 

// When adding an element 
ParentElement.Add(NewElement); //ParentElement and NewElement are of type XElement 

我有這種強烈的感覺,我以前這樣做的時候,我居然沒得做任何特別的事。 .Remove()和.Add()例程以某種方式通知綁定,即.Elements()中的項目已更改並且屏幕自動更新。無論如何,這次不會工作。有誰知道爲什麼?

+1

您是否嘗試過ObservableCollection 而不是列表 mbursill

+0

我沒有嘗試過,但我只是做了,沒有任何改變。我沒有想到它能夠正常工作。該集合只能用於最高級別。在第一個元素之後,由.Elements()返回的集合將填充樹並將與綁定進行交互。 – Ultratrunks

回答

0

好的,我有一個解決我自己的問題。我不確定爲什麼我認爲這本來不需要做任何特別的工作,但似乎並非如此。

爲了更清楚地說明問題,我沒有像使用XElement對象那樣使用Xelement對象,而是使用另一個類包裝它,以便我可以添加更多的功能。這很好,因爲事實證明我需要INotifyPropertyChanged接口並重寫一些方法來獲得我想要的行爲。我的實際類標題看起來像這樣。

public class TreeElement : XElement, INotifyPropertyChanged 
{ 
    ... 
} 

由於我的TreeView對所XElement.Elements結合()例程,它沒有收到通知時,我添加或刪除的元素。原因是因爲XElement.Elements()不是依賴項屬性。它是一個例程。我提前知道這一點,但由於某種原因,我很固執,仍然認爲它會起作用。所以我需要添加的是INotifyPropertyChanged接口,然後每當操作發生時調用NotifyPropertyChanged()例程,這會導致XElement.Elements()中的數據發生更改。即,它們是XElement.Add()和XElement.Remove()例程。還有更多,但我只會談論這兩個。

這些例程不可覆蓋,但可以使用「新」關鍵字隱藏這些例程。這是這些例程的新實現。

public new void Remove() 
{ 
    XElement parent = this.Parent; 
    base.Remove(); 

    if ((parent != null) && (parent.GetType() == typeof(TreeElement))) 
    { 
    //need to tell parent that they are losing an element 
    ((TreeElement)parent).NotifyPropertyChanged("Elements"); 
    } 
} 


public new void Add(object Content) 
{ 
    base.Add(Content); 
    NotifyPropertyChanged("Elements"); 
} 

正如你可以看到,即使.Elements()不是一個屬性NotifyPropertyChanged(「元素」)在方法通知我結合「的ItemsSource =‘{綁定路徑=元素}’」工作得很好。所以現在當我更新代碼後面使用.Add()或.Remove()我的樹自動更新。