DataTrigger не привязан в стиле - PullRequest
0 голосов
/ 16 июня 2020

У меня проблемы с использованием триггера данных в моем стиле.

Я хочу включить свойство HasImage моего SelectedLocationInPage. В качестве простого теста, который я могу прочитать свойство, это работает:

<UserControl>
    <DockPanel VerticalAlignment="Stretch" HorizontalAlignment="Stretch">
        <Grid HorizontalAlignment="Stretch">
            <ContentControl Content="{Binding ExamManager}">
                <ContentControl.Resources>
                    <DataTemplate DataType="{x:Type vm:LocationViewModel}">
                        <Button Style="{StaticResource imageLocationButton}">
                            <ContentControl Content="{Binding}"/>
                        </Button>
                    </DataTemplate>
                </ContentControl.Resources>
            </ContentControl>

            <DockPanel Grid.Column="1">
                <Border BorderBrush="Black" BorderThickness="1" Margin="20">
                    <ContentControl Content="{Binding SelectedLocationInPage}">
                        <ContentControl.Style>
                            <Style TargetType="{x:Type ContentControl}">
                                <Setter Property="ContentTemplate">
                                    <Setter.Value>
                                        <DataTemplate>
                                            <TextBlock Text="{Binding HasImage}" FontSize="100"/>
                                        </DataTemplate>
                                    </Setter.Value>
                                </Setter>
                            </Style>
                        </ContentControl.Style>
                    </ContentControl>
                </Border>
            </DockPanel>
        </Grid>
    </DockPanel>
</UserControl>

Верхний элемент управления содержимым отображает сетку ячеек (экзамен), и когда вы выбираете ячейку, эта ячейка должна отображаться в нижнем контроль содержания. Как написано выше, при выборе ячейки с изображением или без изображения (HasImage == true/false) правильно отображается «Истина» или «Ложь» в нижнем элементе управления содержимым.

Итак, я делаю следующий шаг и пытаюсь визуализировать разные шаблоны содержимого в зависимости от значения HasImage, и я не могу заставить его работать. Когда я использую приведенный ниже код, в представлении просто отображается строковое представление по умолчанию (т. Е. Полностью определенный тип SelectedLocationInPage).

(Я также пробовал привязать к DataContext.HasImage, но безрезультатно. Также , Я знаю, что технически мне не нужно обрабатывать истину и ложь - я мог / должен иметь одно значение по умолчанию и один триггер, но я хочу убедиться, что все, что я пытаюсь, находится на одном уровне, чтобы избежать путаницы, как и я выяснить это)

<ContentControl Content="{Binding SelectedLocationInPage}">
    <ContentControl.Style>
        <Style TargetType="{x:Type ContentControl}">
            <Style.Triggers>
                <DataTrigger Binding="{Binding HasImage}" Value="True">
                    <Setter Property="ContentTemplate">
                        <Setter.Value>
                            <DataTemplate>
                                <TextBlock Text="HAS IMAGE" FontSize="100"/>
                            </DataTemplate>
                        </Setter.Value>
                    </Setter>
                </DataTrigger>
                <DataTrigger Binding="{Binding HasImage}" Value="False">
                    <Setter Property="ContentTemplate">
                        <Setter.Value>
                            <DataTemplate>
                                <TextBlock Text="NO IMAGE" FontSize="100"/>
                            </DataTemplate>
                        </Setter.Value>
                    </Setter>
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </ContentControl.Style>
</ContentControl>

Я не уверен, есть ли какой-либо другой код, который мог бы помочь (viewmodels et c), я считаю, что все, что вам нужно знать, это то, что HasImage - это свойство типа bool из SelectedImageInPage, и что в первом примере свойство HasImage работает без проблем.

Ответы [ 2 ]

0 голосов
/ 17 июня 2020

Привязка напрямую к HasImage работает только в ContentTemplate из ContentControl при условии, что текущий Content имеет свойство HasImage.

DataContext из ContentControl сам, к которому применяется Style, не имеет свойства HasImage.

Попробуйте привязать к Content.HasImage:

<TextBlock Text="{Binding Content.HasImage}" FontSize="100"/>
0 голосов
/ 17 июня 2020

Похоже, что привязка во втором фрагменте кода должна быть:

<DataTrigger Binding="{Binding SelectedLocationInPage.HasImage}">

{Binding HasImage} работает внутри DataTemplate, потому что DataContext автоматически изменяется на значение ContentControl.Content, но эти DataTrigger определены вне из DataTemplate на уровне ContentControl, поэтому они используют тот же DataContext, что и Content="{Binding SelectedLocationInPage}".

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...