Подтвердить что ты не робот

Отображать DataTemplate по умолчанию в ContentControl, когда его содержимое является нулевым или пустым?

Я бы подумал, что это возможно, но очевидный способ не работает.

В настоящее время я делаю это:

<ContentControl
    Content="{Binding HurfView.EditedPart}">
    <ContentControl.Resources>
        <Style
            TargetType="ContentControl"
            x:Key="emptytemplate">
            <Style.Triggers>
                <DataTrigger
                    Binding="{Binding RelativeSource={x:Static RelativeSource.Self}, Path=Content}"
                    Value="{x:Null}">
                    <Setter
                        Property="ContentControl.Template">
                        <Setter.Value>
                            <ControlTemplate>
                                <Grid
                                    HorizontalAlignment="Stretch"
                                    VerticalAlignment="Stretch">
                                    <TextBlock>EMPTY!</TextBlock>
                                </Grid>
                            </ControlTemplate>
                        </Setter.Value>
                    </Setter>
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </ContentControl.Resources>
</ContentControl>

Я не получаю никаких ошибок привязки, и это компилируется. Однако он не дает ожидаемого результата. Я также пробовал очевидное:

<DataTemplate DataType="{x:Null}"><TextBlock>Hurf</TextBlock></DataTemplate>

Это не будет компилироваться. И попытка установить контент дважды терпит неудачу:

<ContentControl
    Content="{Binding HurfView.EditedPart}">
        <TextBlock>DEFAULT DISPLAY</TextBlock>
</ContentControl>

Можно ли это сделать без написания настраиваемого селектора шаблонов?

4b9b3361

Ответ 1

Простым, вам нужно связать свойство контента в стиле. Стили не будут перезаписывать значение элемента управления, если присутствует привязка, даже если значение имеет значение Null. Попробуйте это.

<ContentControl>
    <ContentControl.Style>
        <Style TargetType="ContentControl">
            <Setter Property="Content" Value="{Binding HurfView.EditedPart}" />
            <Style.Triggers>
                <DataTrigger Binding="{Binding RelativeSource={x:Static RelativeSource.Self}, Path=Content}" Value="{x:Null}">
                    <Setter Property="ContentControl.Template">
                        <Setter.Value>
                            <ControlTemplate>
                                <Grid HorizontalAlignment="Stretch" VerticalAlignment="Stretch">
                                    <TextBlock>EMPTY!</TextBlock>
                                </Grid>
                            </ControlTemplate>
                        </Setter.Value>
                    </Setter>
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </ContentControl.Style>
</ContentControl>

Ответ 2

Поскольку я наткнулся на этот вопрос и сегодня столкнулся с такой же проблемой, я хотел бы внести еще один вклад в решение этой проблемы. Поскольку я не хотел добавлять еще один триггер стиля, я использовал свойство TargetNullValue, которое кажется немного более читаемым, чем принятое решение (которое все же работает):

    <ContentControl>
      <ContentControl.Content>
        <Binding Path="ContentViewModel">
          <Binding.TargetNullValue>
            <Grid HorizontalAlignment="Stretch" VerticalAlignment="Stretch">
              <TextBlock>EMPTY!</TextBlock>
            </Grid>
          </Binding.TargetNullValue>
        </Binding>
      </ContentControl.Content>
    </ContentControl>

Ответ 3

Вы можете вернуть DBNull.Value как FallbackValue привязки для содержимого ContentControl и создать DataTemplate для DBNull:

<DataTemplate DataType="{x:Type system:DBNull}">
    <!-- The default template -->
</DataTemplate>

...

<ContentControl Content="{Binding HurfView.EditedPart, FallbackValue={x:Static system:DBNull.Value}}" />