Zeigen Sie eine StandarddataTemplate in einem ContentControl an, wenn sein Inhalt null oder leer ist?
-
07-07-2019 - |
Frage
Ich würde denken, dass dies möglich ist, aber der offensichtliche Weg funktioniert nicht.
Derzeit mache ich das:
<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>
Ich bekomme keine Bindungsfehler und dieses kompiliert. Es führt jedoch nicht das erwartete Ergebnis. Ich habe auch das Offensichtliche ausprobiert:
<DataTemplate DataType="{x:Null}"><TextBlock>Hurf</TextBlock></DataTemplate>
Dies wird nicht kompilieren. Und der Versuch, den Inhalt zweimal festzustellen, schlägt ebenfalls fehl:
<ContentControl
Content="{Binding HurfView.EditedPart}">
<TextBlock>DEFAULT DISPLAY</TextBlock>
</ContentControl>
Kann ich dies tun, ohne einen benutzerdefinierten Vorlagenwählers zu schreiben?
Lösung
Einfach, Sie müssen die Inhaltseigenschaft im Stil binden. Styles überschreibt keinen Wert für eine Kontrolle, wenn eine Bindung vorhanden ist, auch wenn der Wert auf NULL bewertet. Versuche dies.
<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>
Andere Tipps
Da ich auf diese Frage gestoßen bin und heute das gleiche Problem hatte, wollte ich einen anderen Weg beitragen, wie ich das Problem gelöst habe. Da ich keinen weiteren Style -Trigger hinzufügen wollte, habe ich die Eigenschaft verwendet TargetNullValue
Das scheint etwas lesbarer zu sein als die akzeptierte Lösung (die dennoch funktioniert):
<ContentControl>
<ContentControl.Content>
<Binding Path="ContentViewModel">
<Binding.TargetNullValue>
<Grid HorizontalAlignment="Stretch" VerticalAlignment="Stretch">
<TextBlock>EMPTY!</TextBlock>
</Grid>
</Binding.TargetNullValue>
</Binding>
</ContentControl.Content>
</ContentControl>
Sie können dbnull.Value als Fallbackwert der Bindung für den Inhalt des ContentControl zurückgeben und eine DataTemplate für DBNull erstellen:
<DataTemplate DataType="{x:Type system:DBNull}">
<!-- The default template -->
</DataTemplate>
...
<ContentControl Content="{Binding HurfView.EditedPart, FallbackValue={x:Static system:DBNull.Value}}" />