2

AutoCompleteBox画面の 1 つにアクセスしようとしています。FindControl()すると、コントロールが配置されていることがわかりますvar testControl = FindControl("MyControl");

ただし、これを操作できるようにする必要があるコントロールのタイプにキャストしようとすると、結果はnull.

これは私がやっていることです:

System.Windows.Controls.AutoCompleteBox testBox = new System.Windows.Controls.AutoCompleteBox();
testBox = testControl as System.Windows.Controls.AutoCompleteBox;

testBoxnull になります。

コントロールがAutoCompleteBox画面上にあることは間違いありませんが、何が間違っているのかわかりません。誰でも助けることができますか?

編集:ヤンのおかげで、次のコードでこれを解決できました:

this.FindControl("MyControl").ControlAvailable += (p, e) =>
        {
            //For every  use I can just cast like ((System.Windows.Controls.AutoCompleteBox)e.Control)
        };
4

2 に答える 2

1

null を返す場合asは、間違った型にキャストしようとしています。つまり、testControlタイプではありませんAutoCompleteBox

testControlその 2 行目にブレークポイントを置き、実行時に実際にどのような型であるかを確認します。

于 2012-10-25T11:54:20.153 に答える
1

あなたが発見したように、あなたが得るオブジェクトFindControlは単なるプロキシオブジェクトです。実際のコントロールを取得する方法は、次の 2 つの手順で行います。

  1. screenのメソッドにコードを追加しますCreated(screen のメソッドが実行されるまで、コントロールが使用可能であるとは限りませんCreated)。
  2. 次に、ハンドラをプロキシのControlAvailableメソッドに追加します。
Private Sub ScreensName_Created

      FindControl("ControlsName"). AddressOf ControlsName_ControlAvailable

End Sub

Private Sub ControlsName_ControlAvailable(sender as Object, e as ControlAvailableEventArgs)

    'do whatever you want in here
    'you can cast e.Control to whatever is the type of the underlying Silverlight control.

End Sub

もちろん、「ScreensName」と「ControlsName」を独自の名前に置き換える必要があります。

(何らかの理由で、2 つのメソッドのテキスト全体をコードとしてうまくフォーマットできませんでした)

于 2012-10-26T05:30:08.400 に答える