我正在尝试研究如何捕获行为中的数据绑定(截取或后处理)以自定义目标控件中的数据显示。
我知道IValueConvertor
并了解我可以将一个简单的值转换为另一个简单的值,但我不相信这对我的需求是足够的......这是:
这种情况下的控件是TextBlock
,我ObservableCollection
中对象的数据值是可变长度字符串。我希望通过将字符串拆分成多个部分来呈现多种颜色的字符串,并以编程方式为<Run Foreground="xxx" Text="yyy"/>
内的每个部分创建TextBlock
。
由于字符串是可变长度的,并且颜色必须以字符串的内容以编程方式确定,我不相信我可以在XAML中预先创建<Run>
,所以我必须以某种方式加入数据绑定操作并在绑定时(或很快之后)生成<Run>
。
Binding.NotifyOnTargetUpdated
似乎是一种设置事件处理程序来完成工作的方法,但这在Windows Phone简化的Silverlight实现中是不可用的。
有什么想法吗?所有搜索结果似乎都指向上述内容,但我正在寻找更多内容。
答案 0 :(得分:0)
显然已经耗尽了所有关于Windows Phone选项的Silverlight选项以通过数据模型以编程方式挂钩ListBoxItems的呈现,我最终为Loaded="..."
的XAML添加了TextBlock
事件处理程序
它不是最好的解决方案,但也许只是我的代码首选项说话,它实际上是在Windows Phone上执行它的正确方法。
在任何情况下,因为我直接挂钩TextBlock
,我不知道如何到达包含ListBoxItem
的{{1}}上的数据绑定对象。如果有人有关于如何将树备份到生成的ListBoxItem的建议,那么我可以直接使用绑定对象,而不是从其他地方检索它。
请注意,由于生成了TextBlock
,因此我没有找到在XAML中为其放置ListBoxItem
事件处理程序的位置。 Loaded="..."
不接受ListBox.ItemTemplate
属性。
更新:这不起作用!
首次创建和加载Loaded
时会触发Loaded事件处理程序,因此替换最初会起作用。
BUT
生成的TextBlock
似乎是被回收的(我猜是ListBoxItem
,当有许多 off-时,通过实例化一个全新的容器不想使用过多的内存。列表中的屏幕条目暂时不需要看到),当发生这种情况时,Loaded事件不会发生火灾。
由于我在首次加载ListBox.ItemContainerGenerator
时修改了内容,这会破坏绑定关联,因此当TextBlock
被回收时,它现在包含旧的/不正确的数据。
仍然没有解决方案。
我正在考虑尝试使用IValueConvertor并以某种方式传递对绑定目标的引用...现在确定如何。
更新2:终于让它发挥作用......
使用ListBoxItem
事件处理程序,可以禁用Loaded="..."
在ListBoxItem
下使用的configuring the VirtualizingStackPanel对以前生成的ListBox
的回收。
在ListBox
集合VirtualizingStackPanel.VirtualizationMode="Standard"
的XAML中,强制每次生成一个新的ListBoxItem,而不是回收以前生成的ListBoxItem。
这意味着每次调用Loaded
事件处理程序,我可以用TextBlock
替换<Run>
的普通文本,以生成动态着色文本。