wpf datatemplate default-value contentcontrol

wpf - ¿Visualiza un DataTemplate predeterminado en un ContentControl cuando su contenido es nulo o está vacío?



default-value (3)

Como me encontré con esta pregunta y tuve el mismo problema hoy, quise contribuir de otra manera a cómo resolví el problema. Como no me gustaba agregar otro disparador de estilo, utilicé la propiedad TargetNullValue que parece ser un poco más legible que la solución aceptada (que funciona de todos modos):

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

Pensaría que esto es posible, pero la forma obvia no está funcionando.

Actualmente, estoy haciendo esto:

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

No estoy recibiendo ningún error vinculante y esto compila. Sin embargo, no produce el resultado esperado. También probé lo obvio:

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

Esto no compilará Y al intentar establecer el contenido dos veces falla también:

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

¿Puedo hacer esto sin escribir un selector de plantilla personalizado?


Podría devolver DBNull.Value como FallbackValue of the Binding para el contenido de ContentControl y crear un DataTemplate para DBNull:

<DataTemplate DataType="{x:Type system:DBNull}"> <!-- The default template --> </DataTemplate> ... <ContentControl Content="{Binding HurfView.EditedPart, FallbackValue={x:Static system:DBNull.Value}}" />


Simple, debe vincular la propiedad de contenido en el estilo. Los estilos no sobrescribirán un valor en un control si hay un enlace presente, incluso si el valor se evalúa como nulo. Prueba esto.

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