2017-10-12 16 views
1

私はTabControlのメインウィンドウを持っています。各タブには、UserControlが関連付けられています。 UserControlの1つで、ボタンがあります。ボタンをクリックすると、私のメインウィンドウにあるTabControlSelectedIndexを変更したいと思います。ChildControlからMainWindowのTabControlのSelectedIndexを変更します。

私はMVVMパターンを使用していますので、可能であれば、ボタンのCommandプロパティでXAMLでやりたいと思います。例えば

:事前に

<Button Content="Switch Tab" Command="SwitchTabCommand" /> 

おかげで私の仲間のプログラマー!

EDIT:

ウィンドウのビューモデル:

public class CoolViewModel : BaseViewModel 
{ 
    #region Properties 

    public ObservableCollection<ITabViewModel> Tabs { get; set; } 
    public ITabViewModel SelectedTab { get; set; } 

    #endregion 

    #region Constructor 

    public CoolViewModel() 
    { 
     Tabs = new ObservableCollection<ITabViewModel> 
     { 
      new VeryNiceViewModel(), 
      new VeryNiceViewModel() 
     }; 
    } 

    #endregion 
} 

ここでは、タブ内のユーザーコントロールのコードです:

public class VeryCoolViewModel : BaseViewModel, ITabViewModel 
{ 
    #region Properties 

    public ObservableCollection<Test> Tests { get; set; } 
    public Test currentSelection { get; set; } 
    public string TabHeader { get; set; } 

    #endregion 

    #region Commands 

    ICommand GoToOtherTab { get; set; } 

    #endregion 

    #region Constructor 

    public GabaritSelecteurViewModel() 
    { 
     Tests = new ObservableCollection<Test> 
     { 
      new Test { Title = "Title #1" }, 
      new Test { Title = "Title #2" }, 
      new Test { Title = "Title #3" }, 
      new Test { Title = "Title #4" }, 
      new Test { Title = "Title #5" } 
     }; 

     TabHeader = "Tests"; 

     GoToOtherTab = new RelayCommand(GoToTab, parameter => true); 
    } 

    #endregion 

    #region Methods 

    private void GoToTab(object parameter) 
    { 
     // I don't know how to tell to the 
     // parent window to go to the other tab... 
    } 

    #endregion 
} 

そして、ここでユーザーコントロールのためのXAMLは、(ですTabControlの内部にあります)。

<Button Content="Go to the other tab" Command="{Binding GoToOtherTab}" /> 
+0

SelectedIndexはPITAです。 SelectedItemを使うほうがずっと簡単です(インスタンスがItemsSourceコレクション内にある限り) – Will

答えて

0

は、ユーザーコントロールのXAMLでボタンのCommandプロパティにパブリックプロパティViewModelにバインドそれ

ICommand SwitchTabCommand { get {} set { /* INPC stuff */ } } 

を子供に与えます。

親ビューモデルは、子ビューモデルを作成するときにプロパティにコマンドを割り当てることができます。タブコントロールで親のvmプロパティをSelectedIndexにバインドすると、親が作成するコマンドでバインドされた親viewmodelプロパティを設定できます。

MVVMが完全でなく、usercontrolの子ビューモデルがない場合は、コマンドプロパティをusercontrolの依存プロパティにして、ウィンドウXAMLの親viewmodelコマンドプロパティにバインドします。

+0

私はそのようなことを試みましたが、それをうまく動作させることはできませんでした。 UserControlまたはWindowがnullであることは、常に私に伝えています。私はそれが作成されている順序によって引き起こされたと思う。 – Fred

+0

@Fred簡単に修正できるように聞こえます。コードを見てみましょう。 –

関連する問題