0

我正在尝试解决如何在行为(拦截或后处理)中捕获数据绑定以自定义目标控件中数据的显示。

我知道IValueConvertor并理解我可以将一个简单的值转换为另一个简单的值,但我认为这不足以满足我的需求......它们是:

在这种情况下,控件是 aTextBlock并且来自 my 中对象的数据值ObservableCollection是可变长度字符串。我想通过将字符串分成多个部分并以编程<Run Foreground="xxx" Text="yyy"/>方式为TextBlock.

由于字符串是可变长度的,并且颜色必须通过字符串的内容以编程方式确定,我不相信我可以<Run>在 XAML 中预先创建 s,所以我必须以某种方式参与数据绑定操作和<Run>在绑定时(或不久之后)生成s。

Binding.NotifyOnTargetUpdated这似乎是一种设置事件处理程序来完成工作的方法,但这在 Windows Phone 缩减的 Silverlight 实现中不可用。

有任何想法吗?所有搜索结果似乎都指向上述内容,但我正在寻找更多。

4

1 回答 1

0

显然已经用尽了 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 的普通文本替换为TextBlocks<Run>以生成动态彩色文本。

于 2012-11-22T02:31:49.283 回答