.net TabItem和TabContent模板根据属性值进行更改
我在WPF.Net中有一个TabControl项,其中两个模板用于内容,两个模板用于tabitems。我将自己的对象绑定为ItemsSource,它有两个属性:.net TabItem和TabContent模板根据属性值进行更改,.net,wpf,templates,tabcontrol,tabitem,.net,Wpf,Templates,Tabcontrol,Tabitem,我在WPF.Net中有一个TabControl项,其中两个模板用于内容,两个模板用于tabitems。我将自己的对象绑定为ItemsSource,它有两个属性: public bool IsPrivMsgChannel { get { return _IsPrivMsgChannel; } set { _IsPrivMsgChannel = value; if (_IsPrivMsgChannel)
public bool IsPrivMsgChannel
{
get
{
return _IsPrivMsgChannel;
}
set
{
_IsPrivMsgChannel = value;
if (_IsPrivMsgChannel)
{
Joined = true;
}
}
}
及
第一个属性将在对象初始化时设置,它不会更改。第二个属性可能会更改,它会向UI发送通知
我想基于IsPrivMsgChannel属性更改TabControl的TabItem模板,并基于Joined属性更改TabContent模板
更新我的解决方案如下:
<TabControl x:Name="Channels" Grid.Column="0" Grid.Row="1" TabStripPlacement="Left" SelectionChanged="ChannelChanged" ContentTemplateSelector="{StaticResource MyContentTemplateSelector}" ItemTemplateSelector="{StaticResource MyItemTemplateSelector}">
<TabControl.Resources>
<DataTemplate x:Key="TabItemChannelTemplate">
<Label HorizontalAlignment="Center" VerticalAlignment="Center" Content="{Binding Name}"></Label>
</DataTemplate>
<DataTemplate x:Key="TabItemPrivChatTemplate">
<Label HorizontalAlignment="Center" VerticalAlignment="Center" Content="Private"></Label>
</DataTemplate>
<DataTemplate x:Key="TabContentDisconnected">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"></ColumnDefinition>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="40"></RowDefinition>
<RowDefinition Height="40"></RowDefinition>
<RowDefinition Height="*"></RowDefinition>
</Grid.RowDefinitions>
<Label Grid.Column="0" Grid.Row="0" HorizontalAlignment="Center" VerticalAlignment="Center" Content="{Binding Description}"></Label>
<Button Grid.Column="0" Grid.Row="1" Width="100" Content="Enter this channel" Click="Enter_Channel"></Button>
</Grid>
</DataTemplate>
<DataTemplate x:Key="TabContentConnected">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"></ColumnDefinition>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="40"></RowDefinition>
<RowDefinition Height="40"></RowDefinition>
<RowDefinition Height="*"></RowDefinition>
</Grid.RowDefinitions>
<Label Grid.Column="0" Grid.Row="0" HorizontalAlignment="Center" VerticalAlignment="Center" Content="{Binding Description}"></Label>
<Button Grid.Column="0" Grid.Row="1" Width="100" Content="Leave this channel" Click="Leave_Channel"></Button>
<DockPanel Grid.Column="0" Grid.Row="2">
<ListBox x:Name="GameList" HorizontalContentAlignment="Stretch" ItemTemplate="{DynamicResource GameListTemplate}" ItemsSource="{Binding GameList}" Visibility="{Binding CanHost, Converter={StaticResource BoolToVisibilityConverter}}" DockPanel.Dock="Top" Height="250" SelectionChanged="GameListSelectionChanged"></ListBox>
<ScrollViewer VerticalScrollBarVisibility="Auto" ScrollChanged="MessageScrollChanged" DockPanel.Dock="Bottom">
<TextBox x:Name="Messages" Text="{Binding Messages}" TextWrapping="Wrap"></TextBox>
</ScrollViewer>
</DockPanel>
</Grid>
</DataTemplate>
<Style TargetType="{x:Type TabItem}">
<Style.Triggers>
<DataTrigger Binding="{Binding Joined}" Value="True">
<Setter Property="ContentTemplate" Value="{StaticResource TabContentConnected}"></Setter>
</DataTrigger>
</Style.Triggers>
</Style>
</TabControl.Resources>
</TabControl>
所以我制作了两个DataTemplateSelector类。一个将为项目选择模板,另一个将为内容选择模板
但由于Joined属性可以更改,我必须创建Style.Triggers来处理该属性是否更改,并在需要时更改ContentTemplate
我唯一不明白的是,为什么触发器只与样式的TargetType TabItem一起工作,而不与TargetType TabControl一起工作。听起来你想使用一个。这里有一个使用它的示例:
基本上,您实现了一个
DataTemplateSelector
,其中SelectTemplate
方法根据容器和项目选择要使用的模板,在XAML中创建该模板的实例,然后将其分配给items控件上的ItemTemplateSelector
属性。修改数据触发器,如下所示
<DataTrigger Binding="{Binding Path=DataContext.Joined,RelativeSource={RelativeSource Self}}" Value="True">
<Setter Property="ContentTemplate" Value="{DynamicResource TabContentConnected}" />
</DataTrigger>
<DataTrigger Binding="{Binding Path=DataContext.IsPrivMsgChannel,RelativeSource={RelativeSource Self}}" Value="True">
<Setter Property="ItemTemplate" Value="{DynamicResource TabItemTemplate2}" />
</DataTrigger>
谢谢,这肯定是我解决方案的第一部分,但由于可以更改Joined属性,我需要以某种方式更新我的ContentTemplate。我用Style.Triggers做了这个,但是我不知道为什么只有当我的Style的TargetType是TabItem时它才起作用。你知道为什么它不能与TargetType TabControl一起使用吗?
<DataTrigger Binding="{Binding Path=DataContext.Joined,RelativeSource={RelativeSource Self}}" Value="True">
<Setter Property="ContentTemplate" Value="{DynamicResource TabContentConnected}" />
</DataTrigger>
<DataTrigger Binding="{Binding Path=DataContext.IsPrivMsgChannel,RelativeSource={RelativeSource Self}}" Value="True">
<Setter Property="ItemTemplate" Value="{DynamicResource TabItemTemplate2}" />
</DataTrigger>