从 Child UserControl 更改 MainWindow 中 TabControl 的 SelectedIndex

Posted

技术标签:

【中文标题】从 Child UserControl 更改 MainWindow 中 TabControl 的 SelectedIndex【英文标题】:Change SelectedIndex of TabControl in MainWindow from Child UserControl 【发布时间】:2018-03-23 18:50:42 【问题描述】:

我有一个带有TabControl 的主窗口。每个选项卡都包含一个与之关联的UserControl。在我的UserControl 之一中,我有一个按钮。当我单击按钮时,我想更改主窗口中的TabControlSelectedIndex

我正在使用 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

这是标签内的 UserControl 的代码:

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

这是 UserControl 的 XAML(位于 TabControl 内):

<Button Content="Go to the other tab" Command="Binding GoToOtherTab" />

【问题讨论】:

SelectedIndex 是一个 PITA。使用 SelectedItem 总是更容易(只要您的实例是 ItemsSource 集合中的一个) 【参考方案1】:

给子视图模型一个公共属性

ICommand SwitchTabCommand  get  set  /* INPC stuff */  

将其绑定到用户控件 XAML 中按钮的 Command 属性。

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

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

【讨论】:

我试图做类似的事情,但我从来没有成功过。它总是告诉我 UserControl 或 Window 为空。我认为这是由它们的创建顺序引起的。

以上是关于从 Child UserControl 更改 MainWindow 中 TabControl 的 SelectedIndex的主要内容,如果未能解决你的问题,请参考以下文章

Usercontrol - 从 ViewModel 通知属性更改

创建委托以更改 UserControl 大小

如何使 WPF UserControl 中的一个 DependencyProperty 更改另一个 [重复]

如何从 UserControl 访问 WPF 页面中的公共变量?

如何在 Blend 中动态更改 UserControl 的外观?

停靠更改时,UserControl 未在 FlowLayoutPanel 中呈现