0

意図したとおりに正常に変更されている ContentTemplateSelector があります。これは、一連のテキストブロックを含むリストボックスにあり、リストボックス内の項目を選択すると、その項目のテンプレートがテキストボックスを持つように変更されます (編集できるようになります)。

私が抱えている問題は、テキストボックスにフォーカスがないことです。これは少し面倒です。

そのため、リストボックスの添付プロパティを実装しようとしました。これは、設定するとイベントハンドラを SelectionChanged イベントに添付します。そこから、ドリルダウンしてテキストボックスを見つけ、フォーカスを設定したいと考えています。

ただし、TemplateSelector が適切なテンプレート (テキスト ボックスのあるテンプレート) をまだ選択していないように思われる問題が発生しました。実際、テンプレートは NULL です。これにより、既に TextBlock テンプレートが削除されており、すぐに正しいテンプレートが選択されると思いますが、それはこの SelectionChanged イベント全体が完了した後でのみです。

私の質問は、この DataTemplate に ContentTemplateSelector で適切なテンプレートを選択するように強制する方法を知っていますか、または ListboxItem がフォーカスを取得したときに Template 内でこのテキストボックスを選択する方法についての別のアイデアですか?

ContentPresenter を取得する方法は次のとおりです (選択されている ListboxItem から)。

ContentPresenter cp = FindVisualChild<ContentPresenter>(lbi);

編集:この後にcp.ApplyTemplate()を追加しましたが、何も変わりません。

ただし、この時点ではcp.ContentTemplateは null です。

4

1 に答える 1

0

だから私は自分でそれを理解し、他の誰かが同様の問題を抱えている場合に備えて私の答えを投稿したかった.

まず、TemplateSelector に、最後に選択したテンプレートのプロパティを追加しました。これは、コードで取得できます (SelectedTemplate と呼ばれます)。

次に、リストボックスの選択が変更されたイベントで次のことを行いました。

 ContentPresenter cp = FindVisualChild<ContentPresenter>(lbi);
 var templateSelector = cp.ContentTemplateSelector;
 cp.ApplyTemplate();

 var template = (templateSelector as DegreeLearningItemTemplateSelector)
                            .SelectedTemplate;
 if (template != null)
 {
     var textbox = (TextBox)template.FindName("PART_TextBox", cp);

     if (textbox != null)
     {
        FocusManager.SetFocusedElement(lbi, textbox);
        textbox.CaretIndex = textbox.Text.Length;
     }
 }
于 2014-05-17T16:32:04.433 に答える