数据绑定Run的Text属性

时间:2012-06-08 07:30:01

标签: c# silverlight windows-phone-7 windows-phone-7.1

我正在尝试在运行时在代码中对Run的{​​{1}}进行数据绑定,而我无法在生活中找出方法。

互联网上的一些消息来源表示,如果没有一些(不太漂亮)的额外解决方法,这是不可能的,更重要的是,当你尝试在XAML中完成它时它应该完全失败。

然而,在我的应用程序中,我有以下内容,它的工作非常好:

TextBlock

所以我想:如果可以在XAML中完成,那么应该可以在代码中完成它。

Sofar,无济于事。在代码中使用“常规”绑定方式将不起作用; <DataTemplate x:Key="PitchTemplate"> <Grid Width="120" Height="120" HorizontalAlignment="Center" VerticalAlignment="Center"> <TextBlock HorizontalAlignment="Center" VerticalAlignment="Center" TextAlignment="Center"> <Run Text="{Binding}" FontFamily="{StaticResource PhoneFontFamilySemiBold}" FontSize="36"/> <LineBreak/> <Run Text="{Binding Frequency, StringFormat=\{0:n2\}Hz}" FontFamily="{StaticResource PhoneFontFamilyNormal}" Foreground="{StaticResource PhoneSubtleBrush}"/> </TextBlock> </Grid> </DataTemplate> 类不会从Run继承,因此没有FrameworkElement方法,并且SetBinding属性不是Text

使用DependencyProperty不起作用,因为BindingOperations.SetBinding属性不是Text

我已经接受了这一点,我愿意接受它不能在运行时完成(虽然不是没有最后一次尝试StackOverflow),但我仍然很好奇,如果

  • 这可以在运行时的代码中完成吗?

如果没有:

  • 为什么它在XAML中起作用?

修改

显示的示例就是显示可以在XAML中完成。我需要在代码中创建绑定的原因是我有一个控件可以动态创建其他需要数据绑定的元素。

更新

正如Pete和我都发现的那样, DependencyProperty的依赖属性,但它是私有的。我认为这就是为什么它可以通过XAML工作(xaml解析器在反射时可能有更多的权限,以及关于类的更多知识)。

好处是,这意味着(经过试验和测试)它也可以通过XamlReader.Load()工作,这是(软)我提出的最干净的解决方案。

但如果有人有更好的事情,我会很高兴听到它。

3 个答案:

答案 0 :(得分:2)

Run.Text由私有TextProperty支持,这意味着如果没有一些反射噱头,你不能直接设置它的值,如下所示:

        Run r=new Run();
        r.Text = "Moo";
        var field=r.GetType().GetField("TextProperty", BindingFlags.Static | BindingFlags.NonPublic);
        var dp=field.GetValue(null) as DependencyProperty;
        BindingOperations.SetBinding(r, dp, new Binding {...});

这相当丑陋,但也许它很有用。

您可以找到各种解决方法。 This SO帖子使用自定义附加属性来配置绑定。使用附加属性是因为Run是Silverlight中的密封类,因此您无法创建自己的支持绑定的Run。

答案 1 :(得分:1)

它在XAML中工作但在代码隐藏中不起作用的原因可能是Text有一个依赖属性,但它是私有的。这对我来说有点“黑魔法”,所以这只是一个猜测!这是一个奇怪的,因为在WPF中,Run确实从FrameworkContentElement继承并且有一个SetBinding方法......

您是否可以创建包含文本的公共DependencyProperty的Run子类?我担心目前没有Silverlight开发工具可以试用,但我会稍后再试看。

答案 2 :(得分:0)

感谢Pete&amp; Panagiotis的努力和建议(均为1)。

最后,我决定使用我自己的解决方案(在问题的“更新”部分中找到):创建包含Run的专用XAML字符串,包括绑定,并使用XamlReader.Load()解析它,并返回一个Run对象。

我正在研究的情况非常具体,因此问题的本地解决方案已经足够(目前)。正如Panagiotis所建议的那样,由于Silverlight施加的限制,反射将无法工作。最后,BindableRuns解决方案需要大量的工作来处理嵌套属性,或者我必须“uglify”我的视图模型,所以我放弃它(也是暂时的)。

感谢大家的投入。