2012-11-10 86 views
0

我正在尝试解决如何在动作(拦截或后处理)中捕获数据绑定以自定义目标控件中的数据显示。Windows Phone 7.1数据绑定混淆

我知道IValueConvertor和理解,我可以改变一个简单的值转换成另一种简单的价值,但我不相信这已经足够满足我的需求......它们是:

在这种情况下,控制TextBlock和我的ObservableCollection中的对象的数据值是可变长度字符串。我想通过将它们分成多块并以编程方式为TextBlock中的每个块创建<Run Foreground="xxx" Text="yyy"/>来呈现多种颜色的字符串。

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

Binding.NotifyOnTargetUpdated似乎是设置事件处理程序来完成这项工作的一种方式,但这在Windows Phone的Silverlight实现中没有提供。

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

+1

您绑定的类可能实现了'INotifyPropertyChanged'。如果是这样,您可以订阅“PropertyChanged”事件,并在事件发生时创建控件 –

+0

是的,它的确如此,我会尽力而为 - 谢谢。但有一点是事件处理程序没有得到与该对象绑定到的控件相对应的arg。这是绑定到ListBox的ObservableCollection,因此它可以是任何项目。我是否必须搜索才能找到正确的或者是否有一些数据绑定技巧来找到特定源对象(处理程序_will_知道)的目标? – larryk78

+0

这没有奏效。 'PropertyChanged'没有为我的列表初始设置触发。我尝试连接'ListBox.ItemContainerGenerator.ItemsChanged'和_does_ fire,但是控件尚未生成,即为时过早。根据[这篇文章](http://stackoverflow.com/questions/3674451/how-to-get-the-listboxitem-for-an-item-in-listbox-on-bind-time)应该有一个' ListBox.ItemContainerGenerator.StatusChanged'事件,但在Windows Phone上似乎不存在...所以我仍然卡住。我如何知道ListBoxItems何时被渲染? – larryk78

回答

0

已经耗尽了Windows Phone上的所有精简Silverlight选项,以便通过数据模型以编程方式挂接ListBoxItems的呈现,最后,我为TextBlock的XAML添加了一个Loaded="..."事件处理程序。

它不觉得最好的解决方案,但也许这只是我的代码首选项谈话,它实际上是在Windows Phone上执行它的正确方法。

在任何情况下,因为我钩住TextBlock直接,我不知道如何再拿到就包含TextBlockListBoxItem数据绑定对象......如果任何人有关于如何重新站起来的建议该树生成ListBoxItem然后我可以直接使用绑定的对象,而不是从别处检索它。

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

更新:这不起作用!

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

生成ListBoxItem似乎被回收(我猜由ListBox.ItemContainerGenerator不希望通过实例化一个全新的容器,使用过多的内存时,也有很多关闭屏幕条目该列表不需要被看到一段时间),当发生这种情况时,Loaded事件不会发生火灾。

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

仍然没有解决方案。

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

更新2:终于得到它的工作...

Loaded="..."事件处理坚持,可以通过在幕后所用的ListBoxconfiguring the VirtualizingStackPanel禁用先前生成的ListBoxItem S的回收利用。

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

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