选项卡打开冗余

时间:2014-01-30 18:03:24

标签: c# mvvm

目前当我按下按钮时,他们会生成新页面并在顶部创建一个新标签。我试图建立一个案例,如果已经创建了选项卡,它将被重定向到工作选项卡。我可以得到一些提示或指导。

    public void Show(string name)
    {
        IGridPort tab;
        switch (name)
        {
            case "Contacts":        tab = new ContactsGridViewModel(Events); break;
            case "Businesses":      tab = new ClientGridViewModel(Events); break;
            default:                tab = new QuickLaunchViewModel(Events); break;
        }
        Events.Publish(new ShowTabEvent(tab));
    }

1 个答案:

答案 0 :(得分:0)

在我的应用程序中,我通常为主页面上的每个选项卡都有一个名为PageViewModel的基类,以及一个名为DataPageViewModel的派生类,用于显示只应出现一次的页面(例如,正在编辑)。我维护一个可观察的PageViewModel集合作为ItemsSource传递到我的标签控件中,我还维护一个DataPageViewModel的字典,以便我可以根据它们显示的数据查找它们:

public ObservableCollection<PageViewModel> Pages { get; private set; }
private Dictionary<string, DataPageViewModel> DataPages { get; set; }

我用来键入字典的字符串通常是页面类型和显示数据的唯一标识符的组合。剩下的就是在创建页面之前检查字典,以查看是否已经存在显示该数据的另一个页面,如果确实存在则将该页面设置为活动页面。设置活动页面可以通过获取ObservableCollection的DefaultView并调用MoveCurrentTo来完成,但MVVM中更好的方法是在模型中创建一个属性来保存当前活动的页面:

    private PageViewModel _CurrentPage;
    public PageViewModel CurrentPage
    {
        get { return _CurrentPage; }
        set { _CurrentPage = value; RaisePropertyChanged(() => this.CurrentPage); }
    }

然后将其绑定到选项卡控件中的SelectedItem:

    <TabControl
        ItemsSource="{Binding Pages}"
        SelectedItem="{Binding CurrentPage, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}"
        IsSynchronizedWithCurrentItem="True" />

绑定是双向的,因此如果用户选择一个选项卡,则相应地更新CurrentPage,如果在ViewModel中设置CurrentPage,则将在视图中选择相应的选项卡。