使用(Itemscontrol来管理MVVM的用户控件集合

时间:2014-07-28 02:14:38

标签: c# wpf xaml mvvm itemscontrol

问题:

有没有办法实现我所寻找的目标;简单地将一组视图(UserControls)添加到控件,同时具有一致的MVVM结构? ItemsControl是一种可行的方式,还是应采用不同的方法?

问题

我有一组MVVM项目(带有usercontrol主视图),我希望在另一个控件中呈现这些项目,这些控件可以为它们之间的过渡设置动画。我在控件顶部有一个水平列表框,用作'标签'它们绑定到视图集合。控件的主体显示绑定到列表框所选项目的单个视图,并在选择新选项卡时动画过渡。

enter image description here

我担心的是将视图集合作为新控件的一部分,视图模型在MVVM范例中没有多大意义,如果用户控件可以简单地直接添加到MVVM范例中,它将更有用。控制几乎就像是一个小组。这会让我觉得像ItemsControl这样的东西是可行的,可以像这样使用:

<CustomItemsControl>
    <UserControl1>
    <UserControl2>
    <UserControl3>
    <UserControl4>
</CustomItemsControl>

然后让内容看起来像这样。

<ItemsControl.Template>

<StackPanel>
    <ListBox x:Name="Tabs" Height="35" SelectedIndex="0"
        ItemsSource= >> The binding for the ItemsControls Collection <<
        SelectionChanged="Tabs_TabSelected">
        <ListBox.ItemContainerStyle>
            <Style TargetType="ListBoxItem">
                <Setter Property="HorizontalContentAlignment" Value="Center"/>
            </Style>
        </ListBox.ItemContainerStyle>
        <ListBox.ItemsPanel>
            <ItemsPanelTemplate>
                <UniformGrid Rows="1" 
                             Columns= >> Binding to Collection.Count <<
                />
            </ItemsPanelTemplate>
        </ListBox.ItemsPanel>
    </ListBox>

    <TransitionCtrl Name="TransitionControl" CurrentView="{Binding SelectedItem, ElementName=Tabs}" />

</StackPanel>

</ItemsControl.Template>

从示例中我看过ItemsControl并不打算以这种方式使用。有什么建议让我指出我想要实现的目标吗?

1 个答案:

答案 0 :(得分:1)

你应该使用PRISM view injection技术。最好的方法是使用TabControl作为区域,并在每个模块加载时注入主视图。由于标签不是作为区域构建的,因此您可能需要自定义区域适配器,如here所述。

<TabControl Grid.Row=”1″ Grid.Column=”1″
        cal:RegionManager.RegionName=”TabRegion” Name=”TabRegion”>

从每个模块,

public void Initialize()
{
    regionManager
        .AddToRegion(“TabRegion”, new FirstView())
        .AddToRegion(“TabRegion”, new SecondView());
}