C# 数据绑定运行的文本属性

C# 数据绑定运行的文本属性,c#,silverlight,windows-phone-7,windows-phone-7.1,C#,Silverlight,Windows Phone 7,Windows Phone 7.1,我试图在运行时将文本块的运行数据绑定到代码中,但我一辈子都不知道该怎么做 互联网上的一些资料表明,如果没有一些(不太漂亮的)额外的解决办法,这是不可能的,更重要的是,当您尝试在XAML中实现时,它应该完全失败 然而,在我的应用程序中,我有以下几点,它们工作得很好: <DataTemplate x:Key="PitchTemplate"> <Grid Width="120" Height="120" HorizontalAlignment="Center" Vertica

我试图在运行时将
文本块
运行
数据绑定到代码中,但我一辈子都不知道该怎么做

互联网上的一些资料表明,如果没有一些(不太漂亮的)额外的解决办法,这是不可能的,更重要的是,当您尝试在XAML中实现时,它应该完全失败

然而,在我的应用程序中,我有以下几点,它们工作得很好:

<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>

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

到目前为止,没有用。在代码中使用“常规”绑定方式是行不通的;
Run
类没有继承自
FrameworkElement
,因此没有
SetBinding
方法,并且它的
Text
属性不是
dependencProperty

使用
BindingOperations.SetBinding
无效,因为
Text
属性不是
DependencyProperty

我已经到了我愿意接受在运行时无法完成这一点的地步(虽然不是没有最后一次StackOverflow的尝试),但我仍然很好奇

  • 这可以在运行时在代码中完成吗
若否:

  • 它是如何在XAML中工作的
编辑:

这里显示的示例只是为了说明它可以在XAML中完成。我需要在代码中创建绑定的原因是,我有一个控件可以动态创建其他元素,这些元素需要进行数据绑定

更新:

正如Pete和我都发现的那样,
Text
有一个依赖属性,但它是私有的。我假设这就是它通过XAML工作的原因(当涉及到反射时,XAML解析器可能有更多的权限,并且通常有更多关于类的知识)

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


但是如果有人有更好的,我很高兴听到这个消息。

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


能否创建一个包含文本的公共DependencyProperty的Run子类?很抱歉,目前我手头没有Silverlight开发工具来试用它,但我稍后会尝试看看。

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 {...});
这很难看,但也许有用


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

感谢Pete和Panagiotis的努力和建议(均为1以上)

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

我正在处理的情况非常具体,因此本地解决方案就足够了(目前)。正如Panagiotis所建议的,由于Silverlight的限制,反射将不起作用。最后,解决方案要么需要大量的工作来处理嵌套属性,要么我必须“丑化”我的视图模型,所以我放弃了它(目前也是如此)


谢谢大家的意见

啊,是的,我应该解释一下。这是一个不同的场景,我需要在代码中完成绑定,在代码中动态生成控件。附带的示例只是为了说明它可以在XAML中完成。我将更新这个问题。是的,在通过silverlight库进行反思的同时,我还发现了私有文本依赖属性。这可能就是它从XAML工作的原因。Run类是密封的,因此没有子类。不过,稍微好一点的是,它也可以与XamlReader.Load()一起使用。所以,在找到更好的解决方案之前,我会处理这个问题。老鼠,它也不会密封在WPF中。在没有测试平台的情况下尝试回答问题是有问题的!限制,限制…在不同的XAML平台之间导航有时会是一场噩梦:(我决定采用我自己的解决方案(如我自己的回答中所解释的)。感谢您的努力和建议(上)。不幸的是(还有一件事),反射无法在Windows Phone中使用私有字段,但我会尽力确保(不管怎么说,这只是一个丑陋的解决方案;)。谢谢。老实说,我以前看过附加属性解决方案,但对它不是很着迷。很可能是因为那时我仍然希望有一个“正常”的解决方案;)。如果这是一个更常见的问题,我可能会改用它。我已经决定采用我自己的解决方案(正如我在自己的回答中所解释的)。谢谢你的努力和建议。