3

Run実行時にコード内にデータバインドしようとしていますTextBlockが、一生その方法を理解することはできません。

インターネット上のいくつかの情報源によると、これはいくつかの (あまりきれいではない) 追加の回避策なしでは不可能であり、さらに重要なことに、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ため、使用は機能しません。TextDependencyProperty

私は、実行時にそれを行うことができないことを喜んで受け入れるところまで来ています (ただし、StackOverflow での最後の試行なしではありません)。

  • これは実行時にコードで行うことができますか?

そうでない場合:

  • XAML で機能するのはなぜですか?

編集:

示されている例は、XAML で実行できることを示すためのものです。コードでバインディングを作成する必要がある理由は、データ バインドが必要な他の要素を動的に作成するコントロールがあるためです。

アップデート:

Pete と私が両方とも知ったように、 に依存関係プロパティがありますがText、それは非公開です。それが XAML を介して機能する理由だと思います (xaml パーサーには、リフレクションに関してはおそらくより多くの権利があり、クラスに関する一般的な知識がより多くあります)。

利点は、これが (試してテストした) XamlReader.Load() でも機能することを意味します。これは、(これまでのところ) 私が思いついた最もクリーンなソリューションです。

でも、もっといいものがあれば、教えていただけると嬉しいです。

4

3 に答える 3

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 {...});

これはかなり醜いですが、おそらく便利です。

これにはさまざまな回避策があります。このSO 投稿では、カスタム添付プロパティを使用してバインディングを構成します。Run は Silverlight のシール クラスであるため、添付プロパティが使用されるため、バインディングをサポートする独自の Run を作成することはできません。

于 2012-06-08T08:46:23.347 に答える
1

XAML では機能するがコード ビハインドでは機能しない理由は、Text の依存関係プロパティが存在するためかもしれませんが、それは非公開です。それは私にとっては少し「黒魔術」なので、それは単なる推測です! WPF では Run が FrameworkContentElement から継承し、SetBinding メソッドを持っているため、これは奇妙なものです...

テキストの public DependencyProperty を含む Run のサブクラスを作成できますか? 申し訳ありませんが、現時点では Silverlight 開発ツールを手元に置いておらず、試してみることができませんが、後で試してみることにします。

于 2012-06-08T08:40:17.260 に答える
0

Pete と Panagiotis の努力と提案に感謝します (どちらも 1 つ上)。

最後に、私は自分の解決策 (質問の「更新」セクションにあります) を使用することにしました:Runバインディングを含む専用の XAML 文字列を作成し、XamlReader.Load() を使用してそれを解析し、Runオブジェクトを返します。 .

私が取り組んでいる状況は非常に具体的であるため、問題に対する局所的な解決策で十分です (今のところ)。Panagiotis が示唆するように、Silverlight によって課せられた制限により、リフレクションは機能しません。最後に、BindableRunsソリューションには、ネストされたプロパティを処理するための広範な作業が必要になるか、ビューモデルを「醜く」する必要があるため、破棄しました (これも今のところ)。

ご意見をお寄せいただきありがとうございます。

于 2012-06-08T09:38:08.793 に答える