绑定到父ViewModel的嵌套视图

时间:2014-09-11 19:10:29

标签: c# wpf xaml mvvm user-controls

我有一个主视图模型,包含所有命令和集合。

我有两个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?

我有这样的直觉感觉很简单,但我一直无法弄明白。

1 个答案:

答案 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>