2010-04-06 129 views
0

我有綁定了幾個對象一個TreeView,讓我們說這樣的事情:WPF綁定對象更新通知

public class House 
    { 
     public List<Room> Rooms { get; set; } 
     public List<Person> People { get; set; } 

     public House() 
     { 
      this.Rooms = new List<Room>(); 
      this.People = new List<Person>(); 
     } 

     public void BuildRoom(string name) 
     { 
      this.Rooms.Add(new Room() { Name = name }); 
     } 

     public void DestroyRoom(string name) 
     { 
      this.Rooms.Remove(new Room() { Name = name }); 
     } 

     public void PersonEnter(string name) 
     { 
      this.People.Add(new Person() { Name = name }); 
     } 

     public void PersonLeave(string name) 
     { 
      this.People.Remove(new Person() { Name = name }); 
     } 
    } 

    public class Room 
    { 
     public string Name { get; set; } 
    } 

    public class Person 
    { 
     public string Name { get; set; } 
    } 

TreeView的是看在房子的對象,每當一個房間是建立/銷燬或一個人進入/離開,我的樹視圖更新自己以顯示房子的新狀態(爲簡單起見,我省略了一些實施細節)。

我想要的是知道此更新完成的確切時刻,所以我可以在那裏做一些事情,事情是我創建了所選項目的指示器,並且當某個動作發生時,我需要更新所述指示器的位置,這就是我在樹視圖更新時正好需要它的原因。

讓我知道你是否知道這個解決方案。

此外,代碼並不完美(DestroyRoom和PersonLeave),但你明白了。

謝謝!

+0

那豈不是更容易只是有指標作爲項目模板的一部分,其知名度綁定到IsSelected?這似乎比試圖勾畫繪圖循環更自然,但我不確定你的約束是什麼。 – itowlson 2010-04-06 22:35:45

+0

@itwolson:我們可以,但那會帶來一些我們已經在這個問題中解決的問題。我們已經在這裏度過了幾個小時,而這是唯一的問題。當然,如果我們不能很快解決問題,我們將不得不採取不同的方法,這可能就是您的建議。 謝謝! – Carlo 2010-04-06 23:13:48

回答

0

使用ObservableCollection <T>並將其包裝在CollectionView中以獲取可綁定的CurrentItem。

http://msdn.microsoft.com/en-us/library/system.windows.data.collectionview_members.aspx

+0

其實這就是我有一個ObservableCollection而不是列表,我不應該避免這個細節。無論如何,當CollectionChanged事件發生時,樹視圖還沒有更新它的項目,所以也沒有工作。 – Carlo 2010-04-07 10:00:11

+0

您使用分層數據模板嗎? - 如果沒有,你不會得到子項目。樹視圖的itemsSource屬性是否正確綁定到可觀察集合? (嘗試將標籤的內容綁定到集合的數量,另一個綁定到集合來測試 - 應該在一箇中獲取數字,在另一箇中獲取類名稱)。 – 2010-04-07 22:10:27