正如标题所示,我不想把它全部放在一个ViewModel中,我希望每个tabItem有一个viewModel,但我是WPF和MVVM的新人,所以请光临我。
我为包含TabControl的窗口创建了一个mainViewModel,其中我有这个属性currentViewModel,指向mainViewModel构造函数的默认值
public MainViewModel()
{
currentViewModel = "viewModel1";
}
当用户点击另一个tabItem时,执行
currentViewModel = "viewModel2";
当然set访问器具有onPropertyChanged方法
public String currentViewModel
{
get { return _currentViewModel; }
set
{
_currentViewModel = value;
OnPropertyChanged("currentViewModel");
}
}
另外两个viewModel(viewModel1,viewModel2)每个都确定我要切换的tabItem之一的功能。
现在在我的Main.xaml上我想将我的dataContext首先绑定到MainViewModel,然后绑定到currentViewModel属性。这样每当用户点击tabItem时,currentViewModel属性都会更新,dataContext指向相应的viewmodel。我希望这很清楚
提前致谢
答案 0 :(得分:2)
我怀疑这是你真正想做的事情,如果你有不同的ViewModel,你仍然可以将你的控件绑定到那些ViewModel的集合并根据需要对它们进行模板化。
你只需要在不同的级别创建不同的DataTemplates,这是一个例子(它直接使用模型但现在不重要):
<TabControl>
<TabControl.ItemsSource>
<!-- This is just sample data, normally you would bind this to an
ObservableCollection<ViewModelBase> or something similar -->
<x:Array Type="{x:Type sys:Object}">
<local:Employee Name="John" Occupation="Programmer"/>
<local:Employee Name="Steve" Occupation="Coffee Getter"/>
<local:Machine Manufacturer="iCorp" Model="iMachine"/>
<local:Machine Manufacturer="iCorp" Model="iMachine G2"/>
<local:Employee Name="Marc" Occupation="GUI Designer"/>
</x:Array>
</TabControl.ItemsSource>
<TabControl.Resources>
<!-- These datatemplates define the tab-header appearance, by placing them
in the TabControl.Resources and setting the DataType they get applied
automatically, just make one light-weight template for each ViewModel -->
<DataTemplate DataType="{x:Type local:Employee}">
<TextBlock>
<Run Text="{Binding Name}"/>
<Run Text="("/>
<Run Text="{Binding Occupation}"/>
<Run Text=")"/>
</TextBlock>
</DataTemplate>
<DataTemplate DataType="{x:Type local:Machine}">
<TextBlock>
<Run Text="{Binding Manufacturer}"/>
<Run Text=" - "/>
<Run Text="{Binding Model}"/>
</TextBlock>
</DataTemplate>
<ContentControl x:Key="MainContent" Content="{Binding}">
<ContentControl.Resources>
<!-- This represents the content of the TabItems, you probably
do not need to create DataTemplates but since you could
use a View of the ViewModels instead -->
<DataTemplate DataType="{x:Type local:Employee}">
<StackPanel>
<TextBlock Text="{Binding Name}"/>
<TextBlock Text="{Binding Occupation}"/>
<TextBlock Text="{Binding Id}"/>
<TextBlock Text="{Binding IsActive}"/>
</StackPanel>
</DataTemplate>
<DataTemplate DataType="{x:Type local:Machine}">
<StackPanel>
<TextBlock Text="{Binding Manufacturer}"/>
<TextBlock Text="{Binding Model}"/>
<TextBlock Text="{Binding VintageYear}"/>
<TextBlock Text="{Binding Price}"/>
</StackPanel>
</DataTemplate>
</ContentControl.Resources>
</ContentControl>
</TabControl.Resources>
<TabControl.ContentTemplate> <!-- Setting the content to the resource -->
<DataTemplate>
<Border>
<StaticResource ResourceKey="MainContent"/>
</Border>
</DataTemplate>
</TabControl.ContentTemplate>
</TabControl>
我可能会尝试获取MVVM的具体细节,但希望这已经让我们知道如何处理它。
您可能需要设置模板选择器(TabControl.ContentTemplateSelector
)以获取ViewModel的正确视图。
答案 1 :(得分:2)
我认为一个好的方法是为每个标签项创建用户控件。然后,在每个用户控件中,您将引用要绑定的正确viewModel命名空间。
您的MainWindow将具有tabcontrol,tabcontrol中的每个tabitem将绑定到特定的usercontrol(被视为单独的View)。
mainwindow_View.xaml将绑定到mainwindow_ViewModel.cs tabItem1_View.xaml将绑定到ViewModel1.cs tabItem2_View.xaml将绑定到ViewModel2.cs
如果您需要代码示例,请与我们联系。