从Child UserControl更改MainWindow中的TabControl的SelectedIndex

问题描述:

我有一个主窗口,其中有一个TabControl。每个选项卡都包含与其关联的UserControl。在我的UserControl之一中,我有一个按钮。当我点击按钮时,我想要更改我主窗口中的TabControlSelectedIndex从Child UserControl更改MainWindow中的TabControl的SelectedIndex

我正在使用MVVM模式,所以如果可能的话,我想在XAML中使用我的按钮上的Command属性。

例如:

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

在此先感谢我的同胞的程序员!

编辑:

的窗口视图模式:

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

给孩子视图模型公共财产

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

将其绑定到该用户控件XAML按钮的命令属性。

父视图模型可以在创建子视图模型时向该属性分配命令。您可以将父vm属性绑定到选项卡控件上的SelectedIndex,并且父级创建的命令可以设置绑定父级viewmodel属性。

如果您不打算使用MVVM,并且没有用于usercontrol的子视图模型,请将command属性设置为usercontrol的依赖项属性,并将其绑定到窗口XAML中的父视图模型命令属性。

+0

我试图做这样的事情,但我从来没有设法使它工作。它总是告诉我,UserControl或Window都是空的。我认为这是由他们正在创建的顺序造成的。 – Fred

+0

@Fred这听起来很容易修复。让我们看看代码。 –