2

Listbox コントロール用に定義された 2 つの DataTemplates があります。1 つのテンプレートは非選択状態用で、もう 1 つは選択状態用です (非選択状態よりも詳細を表示します)。

ここの例に従いました:

http://blogs.msdn.com/b/wpfsdk/archive/2007/04/16/how-do-i-programmatically-interact-with-template-generated-elements-part-ii.aspx

コード ビハインドから DataTemplates 内の Elements にアクセスする方法について。

私はそれを正しく理解していますが、UnSelected DataTemplate の要素を見つけて返すだけです。しかし、選択した DataTemplate で要素を検索すると、NullReferenceException が発生します。

私は何が間違っているのでしょうか?

4

2 に答える 2

4

キーボード フォーカスの設定は、datatemplate 要素にアクセスする必要がある理由の 1 つかもしれません。MVVM はその問題を解決せず、FocusManager はキーボード フォーカスを設定しません。

于 2012-02-06T20:55:49.277 に答える
1

あなたは何を間違っていますか?

あなたが間違っているのは、分離コードから DataTemplate 内の要素にアクセスしようとしているということです。 いたずら、いたずら!

冗談はさておき、誰かがコードから DataTemplate 内の要素にアクセスしようとしているのを 99.9% の確率で見ています。多くの初心者は、ビュー モデルを使用するのではなく、UI 要素に直接データを格納する傾向があります。それは、VB、WinForms、ASP.NET の「通常の」方法での経験によって、彼らの心が腐敗したためだと思います。UI 要素にデータを格納する代わりに、ビュー モデルを使用してデータをバインドする理由は数多くあります。詳細については、「モデル ビュー ビュー モデル」をオンラインで検索してください。

今あなたの質問に答えるために:

特定の ListBoxItem は、一度に 1 つの DataTemplate のみを持つことができます。これは、その ContentPresenter に ContentTemplate プロパティが 1 つしかなく、このプロパティが 2 つの異なる値を持つことができないためです。

このため、ListBoxItem の下のビジュアル ツリーは、複数のテンプレートの組み合わせではなく、常に 1 つの特定のテンプレートから生成されます。ListBox の ItemTemplate を変更するか、ListBoxItem.ContentTemplate を更新すると、古いテンプレートによって生成されたビジュアル ツリーが破棄され、新しいテンプレートが構築されます。

繰り返しますが、データ テンプレートを変更すると、古いデータ テンプレートによって生成されたビジュアル ツリーは破棄され、新しいビジュアル ツリーが構築されます。

特定の ListBoxItem で 100 のデータ テンプレートを定義して使用できますが、ビジュアル ツリーをインスタンス化できるのは一度に 1 つだけです。これらは、ビジュアル ツリーの一部として実際に存在する唯一の要素です。他のすべてのテンプレートはテンプレートとしてのみ存在し、実際の要素は作成されません。

別の言い方をすれば、同じコントロールの 2 つの異なるテンプレートによってインスタンス化された 2 つの異なるビジュアル ツリー内の要素を見つける方法について質問しても意味がありません。1 つのコントロールで 2 つの異なるテンプレートを同時にアクティブにすることはできないからです。

これで問題が解決することを願っています。

最後のアドバイス: MVVM をよく読んで、DataTemplates 内の要素にアクセスしようとするのをできるだけ早くやめてください。ただし、実際にテンプレート内の要素にアクセスする正当な理由がある 0.1% の中にいると思われる場合は、アクセスしたい実際の理由を返信してください。さらに詳しいガイダンスを提供できるかもしれません。

于 2010-06-13T08:15:20.337 に答える