MVVM LIght 不可能在 TabItem 上绑定一个视图

MVVM LIght impossible to bind one view on a TabItem

我花了 10 多个小时来探索 MVVM 模式中的大部分内容并绑定到 TabControl。

我不想给出我的实际代码,但我的问题有点简单:

有关信息:我创建了一个 DLL,其中包含我所有的模型和工作类(包括我的服务,我还创建了一个带有接口的 DAOlayout,一切都很好)

如果看不清楚,我深表歉意。如果你需要,我会放下我的代码。

欢迎任何简单的想法。

谢谢。

在设计部分我创建了两个Tab,一个是上传,另一个是下载。

    <UserControl.Resources>
        <Style TargetType="TabItem" x:Key="MainTabItem">
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="TabItem">
                        <DockPanel Height="45" Width="245" >
                            <Separator Name="RightBorder" Style="{StaticResource {x:Static ToolBar.SeparatorStyleKey}}" 
                                  Height="30" DockPanel.Dock="Right" />
                            <Grid Cursor="Hand" Width="245" Background="Transparent" >
                                <TextBlock Name="TabItemTitle" TextAlignment="Center" VerticalAlignment="Center" HorizontalAlignment="Center"

                            </Grid>
                            <ContentPresenter ContentSource="Header"/>
                        </DockPanel>

                        <ControlTemplate.Triggers>
                            <Trigger Property="Name" Value="UploadTab">
                                <Setter TargetName="TabItemTitle" Property="Text" Value="Upload"/>
                            </Trigger>
                            <Trigger Property="Name" Value="DownloadTab">
                                <Setter TargetName="TabItemTitle" Property="Text" Value="Download"/>
                            </Trigger>
                        </ControlTemplate.Triggers>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>
    </UserControl.Resources>

    <Grid  HorizontalAlignment="Center" Background="White">
            <TabControl Name="MediaControl"   SelectionChanged="TabControl_SelectionChanged" Padding="0">
            <TabItem Name="UploadTab" Style="{StaticResource MainTabItem}">
                <Border Name="UploadTabPanel">
                    </Border>
                </TabItem>
                <TabItem Name="DownloadTab" Style="{StaticResource MainTabItem}">
                <Border x:Name="DownloadTabPanel">
                    </Border>
                </TabItem>
            </TabControl>
    </Grid>
</UserControl>

在每次 Tab 之后单击 SelectionChanged event 将被触发并在 TabItem 下显示您的 UI 作为 Border 的 child。在 SelectionChanged event 中,您必须添加 UI 部分...

           private void TabControl_SelectionChanged(object sender, SelectionChangedEventArgs e)
            {
                try
                {
                    string tabItem = ((sender as TabControl).SelectedItem as TabItem).Name as string;
                    switch (tabItem)
                    {
                        case "UploadTab":
                            if (UploadInstance == null) 
                            {
                                UploadInstance = new UploadInstance();
                            }
                            UploadTabPanel.Child = UploadInstance;
                            break;
                        case "DownloadTab":
                            if (DownloadInstance == null)
                            {
                                DownloadInstance = new DownloadInstance();
                            }
                            DownloadTabPanel.Child = DownloadInstance;
                            break;
                    }
                }
                catch (System.Exception ex) { }
            } 

我自己得出了答案。我对 xaml 代码中的视图绑定感到困惑。我用这个简单地弄明白了:

查看:

<TabControl ItemsSource="{Binding Views}">
    <TabControl.ItemTemplate >
        <!-- header template -->
        <DataTemplate>
            <TextBlock Text="{Binding Header}" />
        </DataTemplate>
    </TabControl.ItemTemplate>
    <TabControl.ContentTemplate>
        <!--content template-->
        <DataTemplate>
            <views:ExportView/>
        </DataTemplate>
    </TabControl.ContentTemplate>
</TabControl>

视图模型:

 public sealed class IndexMainViewModel : ViewModelBase
{

    private ObservableCollection<TabItem> _views;

    public ObservableCollection<TabItem> Views
    {
        get { return _views; }
        set
        {
            _views = value;
            RaisePropertyChanged(() => Views);
        }
    }
    public IndexMainViewModel()
    {
        _views = new ObservableCollection<TabItem>();
        _views.Add(new TabItem { Header = "Export", Content = new ExportViewModel()});
        _views.Add(new TabItem { Header = "Import", Content = new ImportViewModel()});
    }
}

我还使用 ViewModelBase 对象(MVVM Light class 对象)创建了一个 TabItem class。如果您没有错过 xaml 代码中的命名空间 <views:ExportView/>,则可以显示此可观察的视图集合。