Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/288.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从子用户控件更改主窗口中TabControl的SelectedIndex_C#_Wpf_Xaml_Mvvm_Command - Fatal编程技术网

C# 从子用户控件更改主窗口中TabControl的SelectedIndex

C# 从子用户控件更改主窗口中TabControl的SelectedIndex,c#,wpf,xaml,mvvm,command,C#,Wpf,Xaml,Mvvm,Command,我有一个主窗口,里面有一个TabControl。每个选项卡都包含一个与其关联的UserControl。在我的一个用户控件中,我有一个按钮。单击按钮时,我想更改主窗口中选项卡控件的SelectedIndex 我使用的是MVVM模式,所以如果可能的话,我希望在XAML中使用按钮上的Command属性 例如: <Button Content="Switch Tab" Command="SwitchTabCommand" /> 提前感谢我的程序员们 编辑: 窗口视图模型: public

我有一个主窗口,里面有一个
TabControl
。每个选项卡都包含一个与其关联的
UserControl
。在我的一个
用户控件中,我有一个按钮。单击按钮时,我想更改主窗口中
选项卡控件
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
}
公共类CoolViewModel:BaseViewModel
{
#区域属性
公共ObservableCollection选项卡{get;set;}
公共ITabViewModel SelectedTab{get;set;}
#端区
#区域构造函数
公共CoolViewModel()
{
Tabs=新的ObservableCollection
{
新的VeryNiceViewModel(),
新的VeryNiceViewModel()
};
}
#端区
}
以下是选项卡中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
}
public类VeryCoolViewModel:BaseViewModel,ITabViewModel
{
#区域属性
公共可观测集合测试{get;set;}
公共测试当前选择{get;set;}
公共字符串TabHeader{get;set;}
#端区
#区域命令
ICommand GoToOtherTab{get;set;}
#端区
#区域构造函数
public GabaritSelecteurViewModel()
{
测试=新的可观察收集
{
新测试{Title=“Title#1”},
新测试{Title=“Title#2”},
新测试{Title=“Title#3”},
新测试{Title=“Title#4”},
新测试{Title=“Title#5”}
};
TabHeader=“测试”;
GoToOtherTab=newrelaycommand(GoToTab,参数=>true);
}
#端区
#区域方法
私有void GoToTab(对象参数)
{
//我不知道该怎么跟警察说
//要转到其他选项卡的父窗口。。。
}
#端区
}
下面是UserControl的XAML(在TabControl中):


为子视图模型提供公共属性

ICommand SwitchTabCommand { get {} set { /* INPC stuff */ } }
将其绑定到usercontrol XAML中按钮的命令属性

父viewmodel可以在创建子viewmodel时为特性指定命令。您可以将父vm属性绑定到选项卡控件上的SelectedIndex,父vm属性创建的命令可以设置绑定的父viewmodel属性


如果您没有使用完整的MVVM,并且usercontrol没有子viewmodel,请将command属性设置为usercontrol的dependency属性,并将其绑定到窗口XAML中的父viewmodel命令属性

为子视图模型提供公共属性

ICommand SwitchTabCommand { get {} set { /* INPC stuff */ } }
将其绑定到usercontrol XAML中按钮的命令属性

父viewmodel可以在创建子viewmodel时为特性指定命令。您可以将父vm属性绑定到选项卡控件上的SelectedIndex,父vm属性创建的命令可以设置绑定的父viewmodel属性


如果您没有使用完整的MVVM,并且usercontrol没有子viewmodel,请将command属性设置为usercontrol的dependency属性,并将其绑定到窗口XAML中的父viewmodel命令属性

SelectedIndex是一个PITA。使用SelectedItem总是比较容易(只要您的实例是ItemsSource集合中的一个实例),SelectedIndex是PITA。使用SelectedItem总是比较容易(只要您的实例是ItemsSource集合中的一个实例),我曾尝试过这样做,但始终没有成功。它总是告诉我UserControl或Window都是空的。我想这是由它们被创造的顺序造成的。我试着做类似的事情,但我从来没有成功过。它总是告诉我UserControl或Window都是空的。我认为这是由它们被创造的顺序造成的。