コンテンツがnullまたは空の場合、ContentControlにデフォルトのDataTemplateを表示しますか?
-
07-07-2019 - |
質問
これは可能だと思いますが、明らかな方法は機能していません。
現在、私はこれをしています:
<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>
これはコンパイルされません。また、コンテンツを2回設定しようとしても失敗します。
<ContentControl
Content="{Binding HurfView.EditedPart}">
<TextBlock>DEFAULT DISPLAY</TextBlock>
</ContentControl>
カスタムテンプレートセレクタを作成せずにこれを実行できますか?
解決
単純な、スタイルのコンテンツプロパティをバインドする必要があります。値が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>
他のヒント
今日この問題に出くわし、同じ問題を抱えていたので、問題を解決する別の方法で貢献したいと考えました。別のスタイルトリガーを追加するのが嫌だったので、受け入れられたソリューション(それでも機能します)よりも読みやすいように思われる TargetNullValue
プロパティを使用しました:
<ContentControl>
<ContentControl.Content>
<Binding Path="ContentViewModel">
<Binding.TargetNullValue>
<Grid HorizontalAlignment="Stretch" VerticalAlignment="Stretch">
<TextBlock>EMPTY!</TextBlock>
</Grid>
</Binding.TargetNullValue>
</Binding>
</ContentControl.Content>
</ContentControl>
ContentControlのコンテンツのバインディングのFallbackValueとしてDBNull.Valueを返し、DBNullのDataTemplateを作成できます:
<DataTemplate DataType="{x:Type system:DBNull}">
<!-- The default template -->
</DataTemplate>
...
<ContentControl Content="{Binding HurfView.EditedPart, FallbackValue={x:Static system:DBNull.Value}}" />
所属していません StackOverflow