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都是空的。我认为这是由它们被创造的顺序造成的。