Привязать шаблон TabItem - PullRequest
0 голосов
/ 19 июня 2020

У меня есть TabControl со списком TabItems внутри, и я хочу использовать разные шаблоны относительно источника. Допустим, 2 элемента TabItem будут привязаны к объекту, а 2 элемента TabItes могут быть привязаны к ObservableCollection.

Для этого я сделал следующее:

Я создал эти ресурсы:

<DataTemplate x:Key="TemplateType1" >
    <StackPanel>
        <Grid Background="{StaticResource WindowBackgroundColor}">
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="auto"/>
                <ColumnDefinition Width="auto"/>
            </Grid.ColumnDefinitions>
            <Grid Margin="10,10,20,10">
                <Grid.RowDefinitions>
                    <RowDefinition Height="40"/>
                    <RowDefinition Height="auto"/>
                    <RowDefinition Height="auto"/>
                </Grid.RowDefinitions>
                <Grid>
                    <Grid.RowDefinitions>
                        <RowDefinition Height="*"/>
                        <RowDefinition Height="*"/>

                    </Grid.RowDefinitions>
                    <RadioButton Visibility="{Binding BottomChoice, Converter={StaticResource BoolToVisConverter}}"
                    Content="True option"
                    GroupName="radioGroup1"
                    IsChecked="{Binding Bottom,
                                        Converter={StaticResource InverseBoolRadioConverter}}" />
                    <RadioButton Grid.Row="1" Visibility="{Binding BottomChoice, Converter={StaticResource BoolToVisConverter}}"
                    Content="False option"
                    GroupName="radioGroup1"
                    IsChecked="{Binding Bottom}" />
                </Grid>
                <Button Grid.Row="1" Width="200">
                    <Image Source="..\img\image_about.png"/>
                </Button>
                <Grid Grid.Row="2">
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition Width="60"/>
                        <ColumnDefinition Width="*"/>
                        <ColumnDefinition Width="60"/>
                    </Grid.ColumnDefinitions>
                    <Button Content="{x:Static p:Resources.Delete}" Click="DeleteMacro_Click" Margin="3" >
                        <Button.Style>
                            <Style TargetType="Button" BasedOn="{StaticResource {x:Type Button}}">
                                <Style.Triggers>
                                    <DataTrigger Binding="{Binding Name, Mode=OneWay}" Value="">
                                        <Setter Property="Button.IsEnabled" Value="False" />
                                    </DataTrigger>
                                </Style.Triggers>
                            </Style>
                        </Button.Style>
                    </Button>
                    <Button Content="{x:Static p:Resources.Change}" Grid.Column="2" Click="EditMacroLeft_Click" Margin="3">
                        <Button.Style>
                            <Style TargetType="Button" BasedOn="{StaticResource {x:Type Button}}">
                                <Style.Triggers>
                                    <DataTrigger Binding="{Binding Name, Mode=OneWay}" Value="">
                                        <Setter Property="Button.Content" Value="{x:Static p:Resources.Add}" />
                                    </DataTrigger>
                                </Style.Triggers>
                            </Style>
                        </Button.Style>
                    </Button>
                </Grid>

            </Grid>
            <Grid Margin="20,10,10,10" Grid.Column="1">
                <Grid.RowDefinitions>
                    <RowDefinition Height="*"/>
                </Grid.RowDefinitions>
            </Grid>
        </Grid>
    </StackPanel>
</DataTemplate>

Затем мой TabItem выглядит так:

<TabItem Header="{x:Static p:Resources.Type1_Right}" Style="{StaticResource VerticalTabItem}">
    <TabItem.ContentTemplate>
        <DataTemplate>
            <Grid>
                <ContentPresenter ContentSource="{Binding MacroRight}" ContentTemplate="{StaticResource TemplateType1}"/>
            </Grid>
        </DataTemplate>
    </TabItem.ContentTemplate>
</TabItem>

Я пытаюсь привязать свой шаблон к MacroRight, но привязка не работает.

Также видно на этом ссылка , что существует возможность DataTemplateSelector, но я не вижу конкретных примеров того, как ее использовать?

1 Ответ

1 голос
/ 23 июня 2020

В документации для ContentSource говорится:

Это свойство следует использовать только тогда, когда ContentPresenter находится в шаблоне. Когда шаблон содержит ContentPresenter с ContentSource, установленным на «Ab c», свойства Content, ContentTemplate и ContentTemplateSelector ContentPresenter автоматически получают псевдонимы Ab c, AbcTemplate и AbcTemplateSelector, соответственно

Вы должны установить его как константу (не связывать) и позволить ему создать привязку содержимого:

<ContentPresenter ContentSource="MacroRight" ...

или связать Content свойство самостоятельно, что кажется более простым для понимания без недостатков:

<ContentPresenter Content="{Binding MacroRight}" ...
...