Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net TabItem和TabContent模板根据属性值进行更改_.net_Wpf_Templates_Tabcontrol_Tabitem - Fatal编程技术网

.net TabItem和TabContent模板根据属性值进行更改

.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)

我在WPF.Net中有一个TabControl项,其中两个模板用于内容,两个模板用于tabitems。我将自己的对象绑定为ItemsSource,它有两个属性:

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>