我有一个主视图模型,包含所有命令和集合。
我有两个UserControl以两种方式显示我的集合,每个usercontrol都有不同的按钮排列。我目前正在使用tabcontrol以在两个视图之间切换。
public DatabaseViewModel()
{
Tabs.Add(new TabItem { Header = "Template", TabContent = new DatabaseByTempViewModel(this) });
Tabs.Add(new TabItem { Header = "Product", TabContent = new DatabaseByProductViewModel(this) });
SelectedTabIndex = 0;
}
public List<TabItem> Tabs { get { return _tabs ?? (_tabs = new List<TabItem>());} }
public class TabItem
{
public string Header { get; set; }
public ViewModelBase TabContent { get; set; }
}
我的XAML目前是这样的:
<UserControl.Resources>
<DataTemplate DataType="{x:Type vm:DatabaseByTempViewModel}">
<local:DatabaseByTempView/>
</DataTemplate>
<DataTemplate DataType="{x:Type vm:DatabaseByProductViewModel}">
<local:DatabaseByProductView/>
</DataTemplate>
<DataTemplate DataType="{x:Type vm:DatabaseViewModel}">
<local:DatabaseView/>
</DataTemplate>
</UserControl.Resources>
<Grid Margin="5">
<DockPanel>
<StackPanel DockPanel.Dock="Bottom" Orientation="Horizontal" FlowDirection="RightToLeft">
<Button Height="25" Width="150" Content="Save Changes" Command="{Binding SaveChangesCommand}" Margin="5" />
</StackPanel>
<TabControl ItemsSource="{Binding Tabs}" SelectedIndex="{Binding SelectedTabIndex}">
<TabControl.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding Header}"/>
</DataTemplate>
</TabControl.ItemTemplate>
<TabControl.ContentTemplate>
<DataTemplate>
<ContentPresenter Content="{Binding TabContent}" ContentSource="{Binding}"/>
</DataTemplate>
</TabControl.ContentTemplate>
</TabControl>
</DockPanel>
</Grid>
我已经在网上翻了一个星期,试图找出最好的方法。我想将所有命令合并到主DatabaseViewModel中,而不是分成两个单独的子ViewModel(这有助于reduncancy)。我还想要能够使用我的Collection的一个实例(位于DatabaseViewModel中)。如何将子视图绑定到主DatabaseViewModel?
我有这样的直觉感觉很简单,但我一直无法弄明白。
答案 0 :(得分:0)
如果您事先知道将有多少视图(并且因为您为每个视图编写新VM,那么总是应该如此),实际上不需要该集合。而是将视图模型创建为主VM的属性,并在XAML中创建TabItem:
public class DatabaseViewModel
{
public DatabaseViewModel()
{
TempView = new DatabaseByTempViewModel();
ProductView = new DatabaseByProductViewModel();
}
public DatabaseByTempViewModel TempView { get; set; }
public DatabaseByProductViewModel ProductView{ get; set; }
}
XAML
<Grid Margin="5">
<DockPanel>
<StackPanel DockPanel.Dock="Bottom" Orientation="Horizontal" FlowDirection="RightToLeft">
<Button Height="25" Width="150" Content="Save Changes" Command="{Binding SaveChangesCommand}" Margin="5" />
</StackPanel>
<TabControl>
<TabItem Header="Temp" DataContext="{Binding TempView}"/>
<TabItem Header="Products" DataContext="{Binding ProductView}"/>
</TabControl>
</DockPanel>