【问题标题】:Windows Phone 7.1 data binding confusionWindows Phone 7.1 数据绑定混乱
【发布时间】:2012-11-10 05:57:27
【问题描述】:

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

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

本例中的控件是TextBlock,我的ObservableCollection 中的对象的数据值是可变长度字符串。我想通过将字符串拆分成多个片段并以编程方式为TextBlock 中的每个片段创建一个<Run Foreground="xxx" Text="yyy"/> 来呈现多种颜色的字符串。

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

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

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

【问题讨论】:

  • 你绑定的类可能实现了INotifyPropertyChanged。如果是这样,您可以订阅PropertyChanged 事件,并在引发事件时创建您的控件
  • 是的,确实如此,我会尝试的 - 谢谢。但有一件事是事件处理程序没有得到与对象绑定到的控件相对应的参数。这是一个绑定到 ListBox 的 ObservableCollection,因此它可以是任何项目。我是否只需要搜索才能找到正确的对象,还是有一些数据绑定技巧可以找到特定源对象的目标(处理程序知道)?
  • 那行不通。 PropertyChanged 没有为我的列表的初始设置触发。我尝试挂钩ListBox.ItemContainerGenerator.ItemsChanged 并且 确实 触发但尚未生成控件,即为时过早。根据this post 应该有一个ListBox.ItemContainerGenerator.StatusChanged 事件,但这似乎在Windows Phone 上不存在......所以我仍然被卡住了。如何知道 ListBoxItems 何时呈现?

标签: windows-phone-7 data-binding


【解决方案1】:

显然已经用尽了 Windows Phone 上用于通过数据模型以编程方式挂钩 ListBoxItems 呈现的所有缩减 Silverlight 选项,我最终为 TextBlock 添加了一个 Loaded="..." 事件处理程序到 XAML。

感觉这不是最好的解决方案,但也许这只是我的代码偏好,它实际上是在 Windows Phone 上执行此操作的正确方法。

在任何情况下,因为我直接与TextBlock 挂钩,所以我不确定如何访问包含TextBlockListBoxItem 上的数据绑定对象...如果有人对如何将树备份到生成的 ListBoxItem 然后我可以直接使用绑定的对象,而不是从其他地方检索它。

请注意,由于生成了 ListBoxItem,我没有找到在 XAML 中放置 Loaded="..." 事件处理程序的位置。 ListBox.ItemTemplate 不接受 Loaded 属性。

更新:这不起作用!

第一次创建和加载 TextBlock 时会触发 Loaded 事件处理程序,因此替换最初会起作用。

但是

生成的ListBoxItem 似乎被回收了(我猜是ListBox.ItemContainerGenerator 在有很多屏幕外 时实例化一个全新的容器不希望使用过多的内存> 列表中暂时不需要看到的条目),当这种情况发生时,Loaded 事件不会触发。

由于我在首次加载 TextBlock 时修改了内容,这会破坏绑定关联,因此当 ListBoxItem 被回收时,它现在包含旧的/不正确的数据。

还是没有解决办法。

我正在考虑尝试使用 IValueConvertor 并以某种方式传递对绑定目标的引用...现在确定如何进行。

更新 2:终于开始工作了...

坚持使用Loaded="..." 事件处理程序,可以禁用configuring the VirtualizingStackPanel 对以前生成的ListBoxItems 的回收,这些ListBox 在幕后使用。

在 XAML 中为 ListBox 设置 VirtualizingStackPanel.VirtualizationMode="Standard" 以强制每次生成一个新的 ListBoxItem,而不是回收以前生成的。

这意味着每次都会调用Loaded 事件处理程序,我可以将TextBlock 的普通文本替换为<Run>s 以生成动态彩色文本。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-30
    • 2014-09-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多