显然已经用尽了 Windows Phone 上所有缩减的 Silverlight 选项,用于通过数据模型以编程方式挂钩 ListBoxItems 的呈现,我最终Loaded="..."
为TextBlock
.
它感觉不是最好的解决方案,但也许这只是我的代码偏好,它实际上是在 Windows Phone 上执行此操作的正确方法。
在任何情况下,因为我TextBlock
直接迷上了,我不确定如何获取ListBoxItem
包含...的数据绑定对象TextBlock
......如果有人对如何将树备份到生成的 ListBoxItem 有建议那么我可以直接使用绑定的对象,而不是从其他地方检索它。
请注意,由于ListBoxItem
生成了,我没有找到在Loaded="..."
XAML 中放置事件处理程序的位置。ListBox.ItemTemplate
不接受Loaded
属性。
更新:这不起作用!
Loaded 事件处理程序在TextBlock
第一次创建和加载时触发,因此替换最初起作用。
但
生成的ListBoxItem
似乎被回收了(我猜想通过ListBox.ItemContainerGenerator
实例化一个全新的容器来使用过多的内存,当列表中有许多屏幕外条目一段时间不需要看到时) 并且当这种情况发生时,Loaded 事件不会触发。
由于我在TextBlock
第一次加载时修改了内容,这会破坏绑定关联,因此在ListBoxItem
回收时,它现在包含旧的/不正确的数据。
仍然没有解决办法。
我正在考虑尝试使用 IValueConvertor 并以某种方式传递对绑定目标的引用......现在确定如何。
更新2:终于让它工作了......
坚持使用事件处理程序,可以通过配置幕后使用的 VirtualizingStackPanelLoaded="..."
来禁用对先前生成ListBoxItem
的 s 的回收。ListBox
在该ListBox
集合的 XAML 中,VirtualizingStackPanel.VirtualizationMode="Standard"
每次强制生成一个新的 ListBoxItem,而不是回收以前生成的 ListBoxItem。
这意味着Loaded
每次都会调用事件处理程序,并且我可以将 s 的普通文本替换为TextBlock
s<Run>
以生成动态彩色文本。