2017-06-17 47 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中的“刷新”并呈现新数据。如果是这样,是我以前告诉过你的更好的方法。我明天会试试看,只是为了好玩。