其他分享
首页 > 其他分享> > 绑定数据的文本属性

绑定数据的文本属性

作者:互联网

我正在尝试在运行时在代码中对TextBlock的Run进行数据绑定,但我一生都无法弄清楚该如何做.

互联网上的一些资料表明,如果没有一些(不太漂亮)的其他解决方法,这是不可能的,而且更重要的是,当您尝试在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属性不是DependencyProperty.

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

我可以接受的观点是,我愿意接受它无法在运行时完成(尽管并非没有最后一次尝试StackOverflow),但是我仍然很好奇

>这可以在运行时用代码完成吗?

如果不:

>它在XAML中如何工作?

编辑:

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

更新:

正如我和Pete都发现的那样,Text有一个依赖项属性,但是它是私有的.我认为这就是它通过XAML起作用的原因(在进行反射时,xaml解析器可能具有更多权限,并且对类有更多的一般了解).

好的一面是,这意味着(经过测试),它也可以通过XamlReader.Load()使用,这是(到目前为止)我提出的最干净的解决方案.

但是,如果有人有更好的东西,我将很高兴听到它.

解决方法:

Run.Text由私有TextProperty支持,这意味着没有一些反射some头就无法直接设置其值,如下所示:

        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 post使用自定义附加属性配置绑定.使用附加属性是因为Run是Silverlight中的密封类,因此您无法创建自己的支持绑定的Run.

标签:windows-phone-7,windows-phone-7-1,c,silverlight
来源: https://codeday.me/bug/20191201/2079266.html