2017-06-17 51 views
0

我有一個ListViewObservableCollectionItemsSource。我如何確保列表視圖對單個收集項目中的更改做出反應?通知列表查看項目中的更改

基本上,我想要一個項目交替背景的列表視圖。當一個項目插入列表中間時,後面的所有內容都需要翻轉。我發現的唯一方法是通過取代集合中的每個受影響的項目,這在iOS中轉化爲難看的視覺效果。我想重新繪製背景。

簡單地綁定背景屬性不起作用:沒有關於屬性更改的通知。

也許有辦法將自定義通知發送到ListView中的所有/某些可見行?

回答

1

如果你有ObservableCollection<MyClass>,那麼MyClass需要實現INotifiyPropertyChanged以便通知綁定的UI它的屬性已經改變。

+0

澄清 - 通過'MyClass'你的意思是'ObservableCollection'中的物品的類(即'ItemsSource = ObservableCollection ')?另外 - 「INotifiyPropertyChanged」的實現應該做什麼? – user1334767

+0

是的,任何類包含在ObservableCollection中。 INotifyPropertyChanged記錄在鏈接的文章中,並且在SO中的其他地方以及遍佈整個網絡的1000個文檔中,因此我不打算在此處給出另一個完整的解釋。基本上,只要您的類的屬性更新,就會觸發PropertyChanged事件。 – Jason

+0

謝謝 - 奇妙地工作! – user1334767

0

我現在想的最好的方法是使用MessagingCenter。當集合更改和消息處理根據項目的實際行進行背景更改時設置消息。

此消息應該在您用來向用戶呈現數據的ViewCell(或任何單元格)上實現。所以,你可以做這樣的事情:

public MyViewCell() 
{ 
    MessagingCenter.Subscribe<object>(this as object, "UpdateBackground", (obj) => 
    { 
     //Your logic to change background here 
    }); 
} 

而當你收集的變化(這是你的控制器,視圖模型或代碼背後)將消息發送給執行該代碼

MessagingCenter.Send(this as object, "UpdateBackground"); 

我唯一擔心的是,如果您訂閱了大量消息(每個項目有1個ViewCell)會影響內存,但我希望這會帶來更好的選擇。

其他的事情,我可以建議是檢查的UITableView(IOS)和ListView(在Android),看看你能做到這一點使用自定義渲染

問候

編輯: 你也可以使用DataTemplateSelector來檢測(取決於綁定到視圖的Item)哪個ItemTemplate使用。我知道如果集合更改DataTemplateSelector重繪或以某種方式回調ListView中的「刷新」並呈現新數據。如果是這樣,是我以前告訴過你的更好的方法。我明天會試試看,只是爲了好玩。