2009-08-01 1 views
32

これは可能だと思いますが、明白な方法は動作しません。コンテンツが空または空の場合、ContentControlにデフォルトのDataTemplateを表示しますか?

現在、私はこれをやっている:

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

カスタムテンプレートセレクタを作成せずにこれを行うことはできますか?あなたがContentControlにコンテンツのためにバインディングのFallbackValueとしてDBNull.Valueのを返す、とはDBNullのためのDataTemplateを作成することができ

答えて

45

シンプルに、あなたはスタイルでcontentプロパティをバインドする必要があります。値が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> 
+0

Worked!ありがとう。 – Will

+0

スタイルやトリガーでもっと複雑なことをしようとすると、人々が作るよくある間違いです。 –

+1

私はこれを返すたびにコメントを残します。ありがとう。 – Will

1

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

... 

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

ちょっと奇妙なこと...それは私の理解でした優先メソッドは[DependencyProperty.UnsetValue](http://msdn.microsoft.com/en-us/library/system.windows.dependencyproperty.unsetvalue.aspx)を返すことでした。私はこれをいくつかのタイプコンバータでやったことがあり、それはうまくいきました... – Will

+2

@はい、それはおそらくもっと良いでしょう。私はその答えを1年以上前に書いていましたが、当時の私のWPFの理解はまだまだ不完全でした... –

+0

私は感情を知っています... – Will

9

私はこの質問につまずいたし、今日と同じ問題を抱えていたので、私はこの問題を解決する方法別の方法を貢献したいと考えていました。私は別のスタイルのトリガーを追加するために好きではなかったので、私は少し読みやすく(それにもかかわらず動作します)受け入れられた解決策よりもあるように思われたプロパティTargetNullValueを使用:

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

の名前を付けます。これは、TargetNullValueを持つ洗練されたソリューションです。ニースfind – juFo

+0

もし私が10kのアップボントを与えることができたら... – curob

+0

鉱山のように動作しますが、それはBinding-Errorsを生成します。私はこれももっと読みやすいと思うが、それを使うときは新しいBinding-Errorsをチェックする。 – Dima

関連する問題