Отображать 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>
Можно ли это сделать без написания настраиваемого селектора шаблонов?
Ответы
Ответ 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}}" />