我的应用程序中有一个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的选定选项卡的名称? 有没有代码背后的解决方案(我不喜欢代码背后;))?