C#/ WPF:绑定TabControl - TabItem(名称)到HeaderedContentControl - 标题

时间:2016-05-20 15:50:53

标签: c# wpf mvvm binding

我的应用程序中有一个HeaderedContentControl。在这个HeaderedContentControl中有一个TabControl 现在,我想在HeaderedContentControl的标题中显示所选选项卡(TabItem)的名称(例如,在Visual Studio中,解决方案资源管理器/团队资源管理器)。 我的应用程序(部分)基于Josh Smiths WPF-MVVM-Example,但我在Unity中使用了额外的Prism。 此外,我将资源分成了一些文件。

这是我的MainView.xaml:

<UserControl x:Class="STController.ModuleAComport.View.MainView"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
         xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
         mc:Ignorable="d"
         d:DesignHeight="300"
         d:DesignWidth="300">


<UserControl.Resources>
    <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="..\Resources\MainViewResources.xaml" />
        </ResourceDictionary.MergedDictionaries>
    </ResourceDictionary>
</UserControl.Resources>

<Grid>
    <Grid.RowDefinitions>
        <RowDefinition />
    </Grid.RowDefinitions>
    <Grid.ColumnDefinitions>
        <ColumnDefinition />
    </Grid.ColumnDefinitions>
    <Grid.Resources>

    </Grid.Resources>


    <Border Grid.Row="0"
            Grid.Column="0"
            Style="{StaticResource MainBorderStyle}">


        <HeaderedContentControl Header="?"
            Style="{StaticResource MainHeadreredContentControlStyle}"
                                ContentTemplate="{StaticResource WorkspacesTemplate}"
                                Content="{Binding Path=Workspaces}" />
    </Border>
</Grid>
</UserControl>

这是我的MainViewResources.xaml:

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                xmlns:view="clr-namespace:STController.ModuleAComport.View"
                xmlns:viewmodel="clr-namespace:STController.ModuleAComport.ViewModel">

<ResourceDictionary.MergedDictionaries>
    <ResourceDictionary Source="pack://application:,,,/STController.Resources;component/Themes/Generic.xaml" />
</ResourceDictionary.MergedDictionaries>

<!-- Put your not shared resource here -->

<DataTemplate DataType="{x:Type viewmodel:ComportViewModel}">
    <view:ComportView />
</DataTemplate>

<DataTemplate DataType="{x:Type viewmodel:TestViewModel}">
    <view:TestView />
</DataTemplate>


<DataTemplate x:Key="TabItemTemplate">
    <Grid>
        <ContentPresenter VerticalAlignment="Center"
                          Content="{Binding Path=DisplayName}" />        
    </Grid>
</DataTemplate>


<DataTemplate x:Key="WorkspacesTemplate">
    <TabControl x:Name="TabControl"
                IsSynchronizedWithCurrentItem="True"
                TabStripPlacement="Bottom"
                Style="{StaticResource MainTabControlStyle}"
                ItemsSource="{Binding}"
                Margin="4"
                ItemTemplate="{StaticResource TabItemTemplate}"
                ItemContainerStyle="{StaticResource MainTabItemStyle}">
    </TabControl>
</DataTemplate>
</ResourceDictionary>

我有两种不同的解决方案:

1)绑定SelectedIndex:
我的第一个想法是将TabControl的SelectedIndex绑定到我的viewmodel中的属性。 有了索引,我就可以选择&#34;相关视图(viewmodel)并获取名称并将其绑定到标题(请参阅HeaderedContentControl; Content =&#34; {Binding Path = Workspaces}&#34 ;;工作空间类型为ObservableCollection)
但是一旦我绑定了TabControl的SelectedIndex属性,TabControl就不再可靠了。有时当我点击TabItem时,它有时不会切换。有时我需要点击十次或更多次。一个非常奇怪的行为。如果我在viewmodel中实现属性(SelectedIndex)没有区别。

2)元素绑定:
我的第二个想法是实现ElementName-Binding 但正如我所料,这不起作用(Visual / Logical Tree)。错误是:

"Cannot find source for binding with reference 'ElementName=TabControl'. 
BindingExpression:Path=ActualHeight; DataItem=null; target element is 
'HeaderedContentControl' (Name=''); target property is 'Header' (type 
'Object')"

在这种情况下,我还试图将TabControl移动到UserControl和Grid的资源中。

所以问题是:是否有可能/如何在HeaderedContentControl的标题中显示TabControl的选定选项卡的名称? 有没有代码背后的解决方案(我不喜欢代码背后;))?

0 个答案:

没有答案