2 Stimmen

WPF ComboBox - zeigt etwas anderes, wenn keine Elemente gebunden sind

Ich habe eine 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 "Retrieving data" in ihm zu zeigen, und geben Sie es ein Aussehen Art ähnlich wie das Wasserzeichen Textbox.

Ich denke, um dies zu tun, ich brauche ein ControlTemplate, und ein Auslöser. Ich habe das ControlTemplate 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 ich den Trigger einrichten, um dies zu zeigen, wenn die ItemsSource-Eigenschaft null ist? Ich habe verschiedene Möglichkeiten ausprobiert, und jede hat mir die Fehlermeldung "Der Wert 'ItemsSource' kann der Eigenschaft 'Property' nicht zugewiesen werden. Ungültiger PropertyDescriptor-Wert.". Meine ComboBox xaml ist dies (einschließlich des versuchten Auslösers):

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

Soll der Auslöser nun auf die ComboBox oder auf das ControlTemplate wirken? Wie greife ich auf die Eigenschaft ItemsSource der ComboBox zu? Sollte ich überhaupt einen Trigger verwenden?

Danke!

4voto

Ray Punkte 44499

Versuchen Sie, die {x:Null} für den Wert der Bedingung anstelle von 0.

Außerdem habe ich es zum Laufen gebracht, indem ich den Auslöser in einen Stil verschoben und leicht modifiziert habe, 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, warum es nur in einem Stil funktioniert, ist, dass nur EventTrigger in der Triggersammlung direkt auf dem Framework-Element erlaubt sind. Für Eigenschaftstrigger (wie oben) müssen Sie einen Stil verwenden (ich lerne jeden Tag etwas dazu).

Voir FrameworkElement.Auslöser

Beachten Sie, dass die Sammlung von Auslösern, die für ein Element eingerichtet wurde, nur EventTrigger und keine Eigenschaftsauslöser (Trigger) unterstützt. Wenn Sie Eigenschafts-Trigger benötigen, müssen Sie diese in einem Stil oder einer Vorlage platzieren und dann diesen Stil oder diese Vorlage dem Element entweder direkt über die Eigenschaft Stil oder indirekt über einen impliziten Stilverweis zuweisen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X