2009-08-01 13 views
32

Bunun mümkün olduğunu düşünürdüm, ama açık yol çalışmıyor.İçeriği boş veya boş olduğunda bir ContentControl'de varsayılan bir DataTemplate görüntüleyin.

Şu anda, bu yapıyorum:

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

Ben herhangi bir bağlayıcı hataları alamıyorum ve bu derler. Ancak, beklenen sonucu üretmiyor. Ayrıca, şu açıklamayı denedim:

Bu, derlenmeyecektir. Ve iki kez içeriğini belirlemeye çalışmanın yanı başarısız:

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

Bu yapabilirim bir özel şablon seçici yazmadan?

cevap

45

Basit, sen tarzı içerik özelliği bağlamak zorunda. Değer, Null olarak değerlendirilse bile, ciltleme mevcutsa, stiller kontrolde bir değerin üzerine yazmaz. Bunu dene. Bu soru tökezledi ve bugün aynı problem vardı bu yana

<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

Çalışıyor! Teşekkürler. – Will

+0

Sorun, kullanıcıların stil ve tetikleyicilerle daha karmaşık şeyler yapmaya çalışırken yaptıkları çok yaygın bir hatadır. –

+1

Her defasında bunun için geri döneceğim. Teşekkürler. – Will

1

Sen DBNull için bir DataTemplate ContentControl İçeriği için Bağlanma FallbackValue olarak DBNull.Value dönün ve oluşturabilirsiniz:

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

... 

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

... O benim anlayış oldu Tercih edilen yöntem [DependencyProperty.UnsetValue] (http://msdn.microsoft.com/en-us/library/system.windows.dependencyproperty.unsetvalue.aspx) dönmek oldu. Bunu bazı tür dönüştürücüler yaptım ve iyi çalıştı ... – Will

+2

@Will, evet, bu muhtemelen daha iyi olurdu. Bu cevabı bir yıldan daha önce yazdım ve o zamanlar WPF anlayışım hala çok eksikti ... –

+0

Duyguları biliyorum ... – Will

9

, ben sorunu nasıl çözdüğünü başka bir yol katkıda bulunmak istedik. Ben (yine de çalışır) kabul çözüm biraz daha okunabilir gibi görünüyor özelliği TargetNullValue kullanılan başka bir stil tetiği eklemek gibi değildi beri: Biraz garip

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

'u adlandırın, bu TargetNullValue ile şık bir çözümdür. Güzel bulmak – juFo

+0

Eğer 10k upvotes verebilirdim ... – curob

+0

Çalışır, ama benim gibi bazı durumlarda Bağlama Hataları üretir. Ayrıca bunun daha okunabilir olduğunu düşünmeme rağmen, yeni Bağlama Hataları'nı kullanırken bunu kontrol edin. – Dima

İlgili konular