2011-02-09 140 views
0

我使用Prism v4和MVVM。 在我的ViewModel我有:WPF MVVM ListView不更新!

private TB_COMPANY tb; 
    public TB_COMPANY Tb { 
     get { 
      return this.tb; 
     } 

     private set { 
      if (this.tb != value) { 
       this.tb = value; 
       this.RaisePropertyChanged(() => this.Tb); 
      } 
     } 
    } 

在我的網頁,我有一個DataGrid(我試着用一個ListView過,不工作!):

<DataGrid ItemsSource="{Binding Tb.TB_ADDRESS.RL_ADDRESS_PHONE}" .../> 

RL_ADDRESS_PHONE是手機列表公司... 所以,在有些時候我的手機添加到列表:

private void MyCommand() 
{ 
    ... 
    Tb.TB_ADDRESS.RL_ADDRESS_PHONE.Add(
     new RL_ADDRESS_PHONE 
     { 
      TB_PHONE = new TB_PHONE 
         { 
          NU_PHONE = _txtTelefone, 
          ST_TYPE = _txtTipoTelefone 
         } 
     }); 
    ... 
} 

但沒有任何反應到UI ... 但在調試中,I ist is fullfiled .... 我應該怎麼做才能更新UI?

+10

神聖的廢話...我希望你沒有控制OVER_YOUR_MODEL_CLASS_AND_PROPERTY_NAMES。無論如何,用框架指南的副本將其擊中。 – Will 2011-02-09 12:27:47

+0

我不明白嗎?你什麼意思? – renanlf 2011-02-09 13:19:25

+2

@Renalf:我們需要查看RL_ADDRESS_PHONE屬性的定義以及RaisePropertyChanged方法的內容。另外,意思是ALL_CAPS_PROPERTIES通常被認爲是使代碼不易讀。有一個由微軟發佈的框架開發指南文檔,其中有最佳實踐,並且這是所提及的。 – 2011-02-09 15:07:56

回答

4

TB_ADDRESSRL_ADDRESS_PHONE財產也必須實施INotifyPropertyChanged以及。如果它是List,則應該使用ObservableCollection,它實現INotifyCollectionChanged,這對於您嘗試實現的行爲是必需的。

另外,作爲一條建議 - 查看C#語言的設計準則和命名約定,可以在msdn中找到它(儘管它說.net 1.1,它仍然適用於以下任何版本的框架)。

2

你的綁定工作嗎?你有沒有檢查輸出窗口?綁定路徑上的所有屬性都是公開的嗎?需要更多的代碼。

所有的財產通知放在一邊:如果您的綁定找到ObservableCollection那麼更新,如果您添加對象。所以我認爲你可能會在路徑上的某處使用字段或非公共屬性。

如果不是這種情況,請確保您不會覆蓋對ObservableCollection的引用,除非您有正確的PropertyChanged通知。 (您應該在綁定路徑的每個類中實現該接口(INotifyPropertyChanged),因爲每個被覆蓋的引用不會通知該視圖將會破壞您的更新)。

0

您提到了使用WCF服務。是否有可能您的可觀察集合是在與UI線程不同的線程上創建的。如果是這種情況,你的UI將無法綁定到它。 Bea Stollnitz在她的博客中討論了跨線程綁定的問題 - >http://bea.stollnitz.com/blog/?p=34

你應該能夠通過在UI線程上創建observable集合來獲得它。