我的菜单项很少,单击每个菜单项,需要将相应的ViewModel加载为新选项卡。为此,我采取了以下方法:

 <dx:DXTabControl OverridesDefaultStyle="True" Margin="2" BorderThickness="0" Padding="0" dxlc:DockLayoutControl.Dock="Client"
                             Grid.Row="1" ItemsSource="{Binding Workspaces}">
                <dx:DXTabControl.View>
                    <dx:TabControlScrollView ShowHeaderMenu="True" ShowHiddenTabItemsInHeaderMenu="False" HeaderLocation="Top" HeaderOrientation="Horizontal" AllowAnimation="True" AllowHideTabItems="True" AutoHideScrollButtons="True"
                                             ScrollViewer.PanningMode="HorizontalOnly" ScrollButtonsShowMode="WhenNeeded"/>
                </dx:DXTabControl.View>
                <dx:DXTabControl.ItemTemplate>
                    <DataTemplate>
                        <ContentControl Content="{Binding Content}"/>
                    </DataTemplate>
                </dx:DXTabControl.ItemTemplate>
            </dx:DXTabControl>

并在ViewModel(C#)中:
 public ObservableCollection<DXTabItem> Workspaces
    {
        get { return workspaces; }
        set { this.Set<ObservableCollection<DXTabItem>>("Workspaces", ref this.workspaces, value); }
    }

并加载ViewModel:
Workspaces = new ObservableCollection<DXTabItem>() { new DXTabItem() { Header = header,
            Content = contentDetails, IsSelected= true, AllowHide = (((WorkspaceViewModel)contentDetails).AllowTabHiding) ? DefaultBoolean.True: DefaultBoolean.False } };

这种方法效果很好,并且给了我想要的行为。但是我确实想摆脱我的ViewModel的DXTabItem,因为这使ViewModel意识到了View。请让我知道解决此问题的最佳方法。

谢谢!
席德

最佳答案

在MVVM-manner中绑定(bind)DXTabControl时,不应在ViewModel的代码中使用DXTabItems。只需将您的数据收集绑定(bind)到Binding to Data帮助文章中指定的DXTabControl.ItemsSource属性即可。
要指定选项卡项目和标题的视觉表示,请分别使用DXTabControl.ItemTemplateDXTabControl.ItemHeaderTemplate模板。

请查看How to bind DXTabControl to data示例以获取详细信息。

10-08 09:15