2011-12-14 20 views
3

私は9個のtabitemを持つtabcontrolを持っています。各タブには、ユーザがデータを入力するための一連のテキストボックスがあります。一番下には、この方法にフックアップクリアボタンは、次のとおりです。TabControlでTabItemを繰り返し処理する

public void ClearTextBoxes() 
    { 
     ChildControls ccChildren = new ChildControls(); 

     foreach (object o in ccChildren.GetChildren(rvraDockPanel, 2)) 
     { 
      if (o.GetType() == typeof(WatermarkTextBox) || o.GetType() == typeof(DateBox) || 
       o.GetType() == typeof(DigitBox) || o.GetType() == typeof(PhoneBox)) 
      { 
       WatermarkTextBox water = (WatermarkTextBox)o; 
       water.Text = ""; 
      } 
      else if (o.GetType() == typeof(ComboBox)) 
      { 
       ComboBox combo = (ComboBox)o; 
       combo.SelectedIndex = -1; 
      } 
      else if (o.GetType() == typeof(CheckBox)) 
      { 
       CheckBox check = (CheckBox)o; 
       check.IsChecked = false; 
      } 
     } 
    } 

これは完全に正常に動作します、しかし、私はまた、ClearAllをタブにユーザーを可能にするのMenuItemを持っています。現在のところ、クリアボタンは、現在選択されているタブの内容だけをクリアし、それ以外はすべてそのまま残します。

 for (int i = 0; i < 10; i++) 
     { 
      tabSelection.SelectedIndex = i; 
      clearButton_Click(null, null); 
     } 

これは、すべてのタブをめくるますが、明確な何もしません。これを行う方法についての私の考えは、このループを備えたtabitemsを反復することでした。代わりにオートメーションを使用してみましたが、同じ結果が得られました。それは何もクリアしていないようです。

ChildControlsクラス:

class ChildControls 
{ 
private List<object> listChildren; 

public List<object> GetChildren(Visual p_vParent, int p_nLevel) 
{ 
    if (p_vParent == null) 
    { 
     throw new ArgumentNullException("Element {0} is null!", p_vParent.ToString()); 
    } 

    this.listChildren = new List<object>(); 

    this.GetChildControls(p_vParent, p_nLevel); 

    return this.listChildren; 

} 

private void GetChildControls(Visual p_vParent, int p_nLevel) 
{ 
    int nChildCount = VisualTreeHelper.GetChildrenCount(p_vParent); 

    for (int i = 0; i <= nChildCount - 1; i++) 
    { 
     Visual v = (Visual)VisualTreeHelper.GetChild(p_vParent, i); 

     listChildren.Add((object)v); 

     if (VisualTreeHelper.GetChildrenCount(v) > 0) 
     { 
      GetChildControls(v, p_nLevel + 1); 
     } 
    } 
} 

}

+1

これはTabControlでのWPFの動作と関係があると思います。私は、タブが見えなくなったときに、前のタブのビジュアルツリーが「ゴミ箱」になっていることを読んだ。 Clear()をクラスに抽象化することができます。 –

答えて

2

あなたのクリーンアップメソッドに次の行を追加する必要が働いて、あなたのコードを取得するには:

 tabControl.SelectedIndex = i; 
-->  UpdateLayout(); 
     Button_Click(null, null); 

UpdateLayoutメソッドが面倒を見ますTabItemが描画され、その後VisualTreeが使用可能であることを示します。

一般的に、このアプローチはうまくいきません。実際のビジネスアプリケーションデータがある場合は、データバインディング/ MVVMをお勧めします。このアプローチでは、ビュー内のコントロールをリセットするのではなく、バックグラウンドでバインドされたビジネスデータをリセットする必要があります。

+0

助けてくれてありがとう。私はMVVMをもっと理解しようとしてきましたが、どこから始めるべきかはわかりません。あなたはそれを開始するための任意のガイド/書籍をお勧めできますか? –

+0

ようこそ。あなただけのことをここで検索すれば、何十ものおすすめを見つけることができます。 http://stackoverflow.com/search?q=MVVM+tutorial – SvenG

+0

これで一日のうちにこれに苦労して、これで解決策が見つかりました。 Winformsは、コントロールを見つけたいときにwpfと比べてとても簡単でした! – user1841243

4

WPFは、選択されていないTabItemVisualTreeをすべて破棄します。したがって、表示されていないタブには実際にコントロールが存在しません。

コントロール値(選択、テキストなど)を維持するには、何かにバインドする必要があります。それらが何かにバインドされている場合は、Clear()メソッドは実際にはUI値ではなく、バウンド値をクリアする必要があります。それらに何も拘束されていない場合、TabControlは選択されると元の状態に戻ります。

+0

SvenGのコメントは、この状況では機能していると答えた。 MVVMの仕組みを実際に理解し始め、どれほど簡単になったかを見ることができたので、私はあなたの投票に投票しました。私はこれに関する次の主要なプロジェクトが私がMVVMに持っているものをMVVMに変換しようとしていると考えています。 –

関連する問題