2011-05-01 33 views
3

我有ListBoxObservableCollection<HostEntry>HostEntry執行INotifyPropertyChanged。目前,我以這種方式綁定他們:如何讓列表框自動刷新使用項目的ToString方法的條目?

 lstHosts.DataContext = _hosts; 
     lstHosts.DisplayMemberPath = "HostName"; 

這很好。當我編輯其中一個HostEntries的名稱時,ListBox會自動刷新,顯示新名稱。

不過,我寧願它顯示HostEntry.ToString()因爲它在默認情況下(不設置DiplayMemberPath,但如果我這樣做,列表不會得到刷新。我相信這是因爲HostName屬性觸發一個PropertyChanged事件,但沒有什麼信號通知ToString()已經改變

有可能我的東西可以添加到這個方法:?

protected void OnPropertyChanged(string propertyName) 
    { 
     if (PropertyChanged != null) 
     { 
      PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
     } 
    } 

要通知ListBox它應該刷新此項目

我不喜歡明確調用ListBox.Items.Refresh()的想法...如果我錯過了一個案例,或者有什麼有多個這個列表的視圖?它也不應該被烘焙到集合中,因爲如果我想使用HostEntry的不同集合呢?應該是在HostEntry課堂內某處做的一種方法,不是嗎?


編輯:我想用ToString()因爲我不只是想顯示HostName財產。我想用一些其他的屬性做一些字符串格式化,我可以在ToString()中輕鬆做到。

+0

我可以問你爲什麼不想使用一個屬性?不設置DisplayMemberPath屬性有什麼好處? – Mark 2011-05-01 02:36:36

+0

@ Mark2:因爲我不想顯示一個簡單的屬性,我想顯示一組屬性。我需要它來調用一個函數,以便我可以合併它們。 – mpen 2011-05-01 16:15:27

回答

3

數據綁定僅適用於您希望其與不可變類和結構的ToString()方法一起使用的方式。也就是說,要更改ToString()的值,您必須替換列表框準備處理的可觀察集合中的條目。

如果您想模擬對具有可變類的ToString()的全面支持,那麼恐怕您必須創建一個屬性,例如調用AsString,並在可能影響該值的任何事情時通知所有更改。這種情況在你的用例中失敗了。

+0

是的,我想這可以解決問題。 – mpen 2011-05-01 16:22:15

1

你有沒有嘗試設置ItemTemplate中的列表框,而不是設置DisplatMemberPath這樣的 -

  <ListBox.ItemTemplate> 
       <DataTemplate> 
        <TextBlock Text="{Binding HostName}"/> 
       </DataTemplate> 
      </ListBox.ItemTemplate> 

我想這是你想要什麼,如果我沒有錯..?

+0

不完全。我想使用一些比綁定到一個屬性更復雜的東西。我想使用'ToString()',以便將其他一些屬性組合成一個顯示值。 – mpen 2011-05-01 16:18:23

+0

對於這種情況,你可以在你的viewmodel中綁定一個單獨的屬性,並在你的getter中寫下你的邏輯組合不同的屬性,並確保當你編輯主機名時,你也可以爲這個屬性更改fire屬性。 – 2011-05-01 16:24:56

+0

@RV:是的,正如裏克所建議的那樣。 – mpen 2011-05-02 01:09:09

相關問題