0

ターゲット コントロールのデータの表示をカスタマイズするために、行為(インターセプトまたは後処理)でデータ バインディングをキャッチする方法を考え出そうとしています。

私は単純な値を別の単純な値に変換できることを知ってIValueConvertorおり、理解していますが、これが私のニーズに十分であるとは思いません...

この場合のコントロールは aTextBlockで、my 内のオブジェクトからのデータ値ObservableCollectionは可変長文字列です。文字列を複数の色に分割し、プログラムで<Run Foreground="xxx" Text="yyy"/>for each を作成して、TextBlock.

<Run>文字列は可変長で、色は文字列の内容からプログラムで決定する必要があるため、XAML で s を事前に作成できるとは思えません。<Run>バインド時 (または直後) に s を生成します。

Binding.NotifyOnTargetUpdated作業を行うイベント ハンドラーをセットアップする方法のように思われますが、Windows Phone の削減された Silverlight 実装では使用できません。

何か案は?すべての検索結果は上記を指しているように見えますが、もう少し探しています。

4

1 に答える 1

0

データ モデルを介して ListBoxItems のレンダリングをプログラムでフックするための、Windows Phone の Silverlight オプションのすべてを削減したように見えたのでLoaded="..."TextBlock.

これは最善の解決策とは思えませんが、おそらくそれは私のコードの好みによるものであり、実際には Windows Phone で正しい方法です。

TextBlockいずれにせよ、私は直接に夢中になっているので、ListBoxItemを含む上でデータバインドされたオブジェクトに到達する方法がわかりませんTextBlock...生成されたListBoxItemにツリーをバックアップする方法について誰かがアドバイスを持っている場合バインドされたオブジェクトを他の場所から取得する代わりに、直接使用できます。

が生成されるため、XAML でそのイベント ハンドラーListBoxItemを配置する場所が見つからないことに注意してください。Loaded="..."は属性ListBox.ItemTemplateを受け入れません。Loaded

更新: これは機能しません!

Loaded イベント ハンドラは、TextBlockが最初に作成されロードされたときに発生するため、置換は最初に機能します。

しかし

生成さListBoxItemれたものはリサイクルされているようです (リストにしばらく表示する必要のない画面外のListBox.ItemContainerGeneratorエントリが多数ある場合に、まったく新しいコンテナをインスタンス化することによって過剰な量のメモリを使用したくないと思います) )、これが発生すると、Loaded イベントは発生しません。

が最初にロードされたときにコンテンツを変更したTextBlockため、バインディングの関連付けが壊れて、ListBoxItemがリサイクルされると、古いデータや正しくないデータが含まれるようになります。

まだ解決策はありません。

IValueConvertor を使用して、どうにかしてバインディング ターゲットへの参照を渡すことを考えています。

更新 2: ようやく動作するようになりました...

イベント ハンドラーに固執することで、内部で使用されるVirtualizingStackPanel を構成することLoaded="..."で、以前に生成された のリサイクルを無効にすることができます。ListBoxItemListBox

ListBoxセットの XAML で、VirtualizingStackPanel.VirtualizationMode="Standard"以前に生成された ListBoxItem をリサイクルするのではなく、毎回新しい ListBoxItem を強制的に生成します。

これは、Loadedイベント ハンドラーが毎回呼び出されることを意味し、動的に色付けされたテキストを生成するために、 の通常のテキストを s にTextBlock置き換えることができます。<Run>

于 2012-11-22T02:31:49.283 に答える