0

好吧,我已经有一段时间摸不着头脑了。但未能找到解决我的问题的方法。我拥有的是带有 ObservableCollection TabItems 的 MainViewModel。MainViewModel 设置为 MainView(用户控件)的 DataContext,后者又托管 TabControl。tabcontrol 绑定到 TabItems 集合。选项卡控件的内容将是 ReportItems 用户控件。

此设置基本上用于报告 SSRS 的 UI 报告。第一个选项卡包含一个报告列表,选择其中将显示一些列表框,用户可以从中选择报告参数。不是在选择参数之后,用户单击一个按钮,该按钮依次生成一个报告并将一个选项卡添加到带有报告主机的选项卡控件。

我试图从选项卡而不是主视图中选择报告的原因是有很多参数要选择,如果我将列表框添加到主视图,留给 tabcontrol 的空间会更少,用户需要向下滚动才能查看报告。

我不确定我的设计是否有缺陷,但我想找到一种方法来将新的 ReportItemViewModel 添加到 TabItem 集合中。这意味着允许子选项卡通过将 ReportItemViewModel 对象发送到 MainViewModel 并添加到集合中来添加同级。

我曾想过使用静态 Collection 来执行此操作,但这不会调用我的 OnPropertyChange 方法。此外,在 MainViewModel 中有一个静态方法也无济于事,因为它无法将对象添加到集合中,因为集合不是静态的。

我没有在这里发布任何代码,因为我被困在如何开始自己。我在这里查看了另一篇文章,但不知道如何使用它。

对不起,描述太长了,只是想把问题说清楚。

我愿意接受任何建议,如果我能得到更好的设计。我很绝望,任何帮助将不胜感激。

4

1 回答 1

3

Add an ICommandto yourMainViewModel用于向您的 中添加新项目ObservableCollection,并使用RelativeSource绑定从TabItem

所以你的 MainViewModel 会有

ObservableCollection<IViewModel> TabItems
IViewModel SelectedTabItem
ICommand AddTabCommand

AddTabCommand基本上在哪里

void AddTab(IViewModel newItem)
{
    TabItems.Add(newItem);
    SelectedTabItem = newItem;
}

你的用户界面会看起来像这样

<DataTemplate DataType="{x:Type local:SelectReportViewModel}">
    <Grid>
        ...
        <!-- Use the CommandParameter property to pass specified ReportItemViewModel to open -->
        <Button Command="{Binding DataContext.AddTabCommand, 
                RelativeSource={RelativeSource AncestorType={x:Type TabControl}}}" />
        ...
    </Grid>
</DataTemplate>

<TabControl ItemsSource="{Binding TabItems}" />

另一种选择是使用某种事件系统,例如 MVVM Light'sMessenger或 Microsoft Prism'sEventAggregator来广播/订阅事件。

MainViewModel将订阅AddTabEvents,而您SelectReportViewModel将在任何时候添加新标签时广播这些事件。如果您有兴趣,我在我的博客文章中有一个关于ViewModel 之间通信的简短摘要。

于 2012-04-12T14:10:34.627 回答