2009-08-01 8 views
32

bym, że to jest możliwe, ale oczywisty sposób nie działa.Wyświetl domyślny DataTemplate w ContentControl, gdy jego zawartość jest pusta lub niekompletna?

Obecnie robię tak:

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

ja nie dostaję żadnych wiążących błędy i to kompiluje. Jednak nie daje oczekiwanego rezultatu. Próbowałem również oczywiste:

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

Nie zostanie skompilowany. Również próba ustawienia zawartości dwukrotnie się nie udała:

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

Czy mogę to zrobić bez pisania niestandardowego selektora szablonów?

Odpowiedz

45

Proste, trzeba powiązać właściwość zawartość w stylu. Style nie nadpisują wartości formantu, jeśli istnieje powiązanie, nawet jeśli wartość jest równa wartości Null. Spróbuj tego.

<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

Pracowałem! Dzięki. – Will

+0

Nie ma problemu, to bardzo powszechny błąd, który popełniają ludzie, próbując robić bardziej złożone rzeczy ze stylami i wyzwalaczami. –

+1

Za każdym razem, gdy tu wracam, zamierzam zostawić komentarz. Dzięki. – Will

1

Ty mógł wrócić DBNull.Value jako FallbackValue wiązania na zawartość ContentControl i utworzyć DataTemplate dla DBNull:

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

... 

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

To trochę dziwne ... To był mój zrozumienia korzystnym sposobem jest powrót [DependencyProperty.UnsetValue] (http://msdn.microsoft.com/en-us/library/system.windows.dependencyproperty.unsetvalue.aspx). Zrobiłem to w niektórych typach konwerterów i działało dobrze ... – Will

+2

@Will, tak, to prawdopodobnie byłoby lepiej. Pisałem, że odpowiedź więcej niż rok temu, a moje zrozumienie WPF w tym czasie był jeszcze bardzo niekompletny ... –

+0

Znam to uczucie ... – Will

9

Od kiedy natknęliśmy się na to pytanie i dzisiaj miał ten sam problem, chciałem przyczynić się w inny sposób, jak I rozwiązać problem. Ponieważ nie chciał dodać kolejny spust stylu użyłem właściwość TargetNullValue która wydaje się być nieco bardziej czytelny niż przyjętego rozwiązania (które działa mimo wszystko):

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

to eleganckie rozwiązanie z TargetNullValue. Nicea znaleźć – juFo

+0

Jeśli mógłbym dać 10k upvotes ... – curob

+0

działa, ale w niektórych przypadkach, takich jak kopalnia produkuje wiążącej błędów. Chociaż myślę, że ten jest bardziej czytelny, sprawdź nowe błędy wiązania podczas korzystania z niego. – Dima

Powiązane problemy