Mvvm 如何从ViewModel中以编程方式切换选项卡?

Mvvm 如何从ViewModel中以编程方式切换选项卡?,mvvm,tabcontrol,Mvvm,Tabcontrol,我有一个MVVM桌面应用程序。在我看来,我有一个选项卡控件 关于通过更改ViewModel上的属性切换到特定选项卡的最佳做法,有何建议 我想可以使用SelectedTab属性来完成,但是选项卡必须存在于ViewModel中,并且视图必须绑定到ViewModel中的选项卡列表。目前,这两个选项卡是静态的,因为我不会在执行期间动态创建/删除任何选项卡。因此我在视图中创建了选项卡,它们表示绑定到同一ViewModel的两组不同控件,因此,对于不同的视图模型实例,不需要使用不同的选项卡。尝试绑定到属性以

我有一个MVVM桌面应用程序。在我看来,我有一个
选项卡控件

关于通过更改ViewModel上的属性切换到特定选项卡的最佳做法,有何建议


我想可以使用
SelectedTab
属性来完成,但是选项卡必须存在于ViewModel中,并且视图必须绑定到ViewModel中的选项卡列表。目前,这两个选项卡是静态的,因为我不会在执行期间动态创建/删除任何选项卡。因此我在视图中创建了选项卡,它们表示绑定到同一ViewModel的两组不同控件,因此,对于不同的视图模型实例,不需要使用不同的选项卡。

尝试绑定到属性以切换到选项卡。

MVVM
透视视图模型不应该知道视图详细信息,如
选项卡容器
等,因此,对于ViewModel,无论是在基础视图上使用
TabContainer
还是
ListView
控件,都没有关系。因此,请考虑一些简单的东西,比如简单的<代码> iQuestaby项,由ViewModel公开,然后绑定到基础视图的UI项容器。


并公开可绑定到UI项容器的相应SelectedTab/SelectedItem索引的
SelectedItemIndex
属性。

在viewmodel上创建一个IsSelected属性,您可以将其数据绑定到选项卡项的IsSelected属性

不确定您正在使用的MVVM框架,但一个可能的解决方案是为每个选项卡提供一个ViewModel,以及一个父ViewModel


然后,父视图模型可以激活相关的子视图模型,然后子视图模型将激活正确的视图。

谢谢您的回答。我没有使用MVVM框架,而是直接按照Josh Smith()所描述的方法对其进行编码。在他的例子中,他确实在每个选项卡上使用了一个ViewModel,这既聪明又有效。但是,在我的例子中,这两个选项卡基于相同的ViewModel,它只是用于处理相同数据的两组独立的UI控件,因此每个选项卡的ViewModel方法在这里不起作用。您可以为每个选项卡将ViewModel分为两个独立的ViewModel吗?或者有两个相同ViewModel的实例指向相同的数据?这两个选项在理论上都是可能的,但仅仅为了坚持“正确的”MVVM结构,就会增加很多不直观的复杂性。对于这个应用程序,我不需要我的MVVM那么纯粹——我还可以从ViewModels启动对话框窗口。但是我认为在我下一个项目的设计阶段,你的评论应该牢记在心,谢谢。这非常有效,而且实现起来非常简单,谢谢。我可以补充一点,对于更紧密地遵循MVVM原则的解决方案,我认为应该在ViewModel中有一个表示OperatingMode的属性,而不是TabIndex。然后,视图可以通过转换器绑定到OperatingMode,该转换器将选定的OperatingMode(可能是枚举?)转换为选项卡索引-在视图中为当前模式选择适当的选项卡。这样,ViewModel仍然不关心选项卡和视图,它只知道用户选择了什么操作模式。类似于此。或者,对于绑定到
TabControl
ItemsSource
的集合中的每个选项卡,都有一个viewmodel。然后,您可以执行用户pickles建议的操作,或者将
SelectedItem
绑定到所选的viewmodel