2009-05-20 15 views
2

Ich habe ein ComboBox, und ich möchte sein Aussehen ändern, wenn die ItemsSource-Eigenschaft null ist. Wenn es in diesem Zustand ist, möchte ich ein TextPanel mit dem Text "Abrufen von Daten" darin anzeigen und es so aussehen lassen, dass es der Wasserzeichen-Textbox ähnelt.WPF ComboBox - zeigt etwas anderes, wenn keine Elemente gebunden sind

Ich denke, ich brauche ein ControlTemplate und einen Trigger. Ich habe das Control hier:

<ControlTemplate x:Key="LoadingComboTemplate" TargetType="{x:Type ComboBox}"> 
    <Grid> 
     <TextBlock x:Name="textBlock" Opacity="0.345" Text="Retrieving data..." Visibility="Hidden" /> 
    </Grid> 
    <!-- 
    <ControlTemplate.Triggers> 
     <Trigger Property="ComboBox.ItemsSource" Value="0"> 
      <Setter Property="Visibility" Value="Visible" /> 
     </Trigger> 
    </ControlTemplate.Triggers> 
    --> 
</ControlTemplate> 

aber mein Problem ist, wie kann ich den Trigger gesetzt, dies zu zeigen, wenn die Itemssource-Eigenschaft null ist? Ich habe verschiedene Methoden ausprobiert, und jeder Weg hat mir die Fehlermeldung "Value 'ItemsSource' kann nicht zugewiesen werden Eigenschaft 'Eigenschaft'. Ungültiger PropertyDescriptor Wert.". Mein ComboBox XAML ist dies (einschließlich der versuchten Trigger):

<ComboBox Margin="112,35,80,0" 
     Name="MyComboBox" 
     Height="22.723" 
     VerticalAlignment="Top" 
     DisplayMemberPath="FriendlyName" 
     SelectedValuePath="Path" 
     TabIndex="160" 
     > 
    <Trigger> 
     <Condition Property="ItemsSource" Value="0" /> 
     <Setter Property="Template" Value="{StaticResource LoadingComboTemplate}" /> 
    </Trigger>  
</ComboBox> 

sollte nun der Auslöser gehen auf der ComboBox, oder auf dem Control? Wie greife ich auf die ItemsSource-Eigenschaft der ComboBox zu? Sollte ich sogar einen Auslöser benutzen?

Danke!

Antwort

4

Try {x:Null} für den Wert der Bedingung setzt statt 0

Auch habe ich es funktioniert, indem Sie den Auslöser, um einen Stil zu bewegen und etwas modifing, siehe unten.

<Style TargetType="ComboBox" x:Key="LoadingComboStyle"> 
    <Style.Triggers> 
     <Trigger Property="ItemsSource" Value="{x:Null}"> 
      <Setter Property="Template" Value="{StaticResource LoadingComboTemplate}" /> 
     </Trigger> 
    </Style.Triggers> 
</Style> 

<ComboBox Style="{StaticResource LoadingComboStyle}" .... > 

Der Grund ist es nur in einem Stil funktioniert, ist, dass nur Eventtriggers in der Trigger-Sammlung auf dem Rahmenelement direkt erlaubt ist. Für Eigenschaftenauslöser (wie oben) müssen Sie einen Stil verwenden (ich lerne jeden Tag etwas).

Siehe FrameworkElement.Triggers

Beachten Sie, dass die Sammlung von Triggern auf ein Element etabliert nur Eventtrigger unterstützt, nicht Eigenschaft Auslöser (Trigger). Wenn Sie Eigenschaftstrigger benötigen, müssen Sie diese in einem Stil oder einer Vorlage platzieren und diesen Stil oder diese Vorlage entweder direkt über die Style-Eigenschaft oder indirekt über eine implizite Stilreferenz dem Element zuweisen.

+0

Dank Ray, hat perfekt funktioniert. – slugster

Verwandte Themen