2016-12-06 6 views
0

Ich habe ein benutzerdefiniertes Benutzersteuerelement, das auf einem Popup (Erweitern eines Popup) basiert. Jetzt in diesem Usercontrol Ich habe dies:Popup ist geöffnet basierend auf 2 Bedingungen

 <Popup.Style> 
    <Style TargetType="Popup"> 
     <Style.Triggers> 
      <DataTrigger Binding="{Binding PlacementTarget.IsMouseOver, RelativeSource={RelativeSource Self}}" Value="True"> 
       <DataTrigger.EnterActions> 
        <BeginStoryboard x:Name="OpenPopupStoryBoard" > 
         <Storyboard> 
          <BooleanAnimationUsingKeyFrames Storyboard.TargetProperty="IsOpen" FillBehavior="HoldEnd"> 
           <DiscreteBooleanKeyFrame KeyTime="0:0:0.10" Value="True"/> 
          </BooleanAnimationUsingKeyFrames> 
         </Storyboard> 
        </BeginStoryboard> 
       </DataTrigger.EnterActions> 
       <DataTrigger.ExitActions> 
        <PauseStoryboard BeginStoryboardName="OpenPopupStoryBoard"/> 
        <BeginStoryboard x:Name="ClosePopupStoryBoard"> 
         <Storyboard> 
          <BooleanAnimationUsingKeyFrames Storyboard.TargetProperty="IsOpen" FillBehavior="HoldEnd"> 
           <DiscreteBooleanKeyFrame KeyTime="0:0:0.2" Value="False"/> 
          </BooleanAnimationUsingKeyFrames> 
         </Storyboard> 
        </BeginStoryboard> 
       </DataTrigger.ExitActions> 
      </DataTrigger> 

      <Trigger Property="IsMouseOver" Value="True"> 
       <Trigger.EnterActions> 
        <PauseStoryboard BeginStoryboardName="ClosePopupStoryBoard" /> 
       </Trigger.EnterActions> 
       <Trigger.ExitActions> 
        <PauseStoryboard BeginStoryboardName="OpenPopupStoryBoard"/> 
        <ResumeStoryboard BeginStoryboardName="ClosePopupStoryBoard" /> 
       </Trigger.ExitActions> 
      </Trigger> 
     </Style.Triggers> 
    </Style> 
</Popup.Style> 

So, jetzt ich das Gespräch in einer anderen Usercontrol, im Grunde das Popup geöffnet wird, wenn über einen ListItem mit der Maus geht über

<CustomControls:StandardPopup Isopen={Binding Value.Items.Count, Mode=OneWay, Converter={StaticResource ItemsCountToBoolean}, ConverterParameter=0}, PlacementTarget="{Binding ElementName=listboxItem}" Heading="ListItemDetails" > 

Nun mein Problem ist Ich versuche, das Popup nicht anzuzeigen, wenn keine Elemente vorhanden sind. Da jedoch bereits ein Trigger für IsOpen = MouseOver vorhanden ist, funktioniert er nicht basierend auf der Anzahl der Elemente. Wie kann ich das lösen?

Ich habe auch schon eine CanOpen Dependency Property auf meinem CustomUserControl ausprobiert und dann versucht, an die IsOpen auf meinem StoryBoard zu binden, aber anscheinend kann man Binding nicht in einem StoryBoard verwenden.

Also ich denke, ich suche nach einer Lösung, um die IsOpen-Basis auf einen Trigger und eine Bindung zu setzen.

+0

MultiDataTrigger? Wenn Sie eine Bindung an eine Count-Eigenschaft einer Auflistung herstellen, stellen Sie außerdem sicher, dass sie INotifyPropertyChanged für die Count-Eigenschaft implementiert (ObservableCollection, List nicht), andernfalls wird Speicher ausgeleert. – Arie

Antwort

0

einen Konverter in diesem DataTrigger

<DataTrigger Binding="{Binding PlacementTarget.IsMouseOver, RelativeSource={RelativeSource Self}}" Value="True">

Verwenden Sie ein Beispiel sein könnte:

<DataTrigger Binding="{Binding PlacementTarget, RelativeSource={RelativeSource Self}, Converter={StaticResource CheckListBoxCnv}}" Value="True">

public class CheckListBoxConverter:IValueConverter 
{ 
    //Check for IsMouseOver property there and do some extra processing, and return true/false value. 
} 
0

ich Sie, ob es keine "Produkte" sind bestimmen weiß nicht, im Popup, aber wie Arie vorschlägt, könnten Sie einen MultiDataTrigger mit mehreren Bedingungen verwenden. Hier ist ein Beispiel für Sie:

<Style TargetType="Popup"> 
    <Style.Triggers> 
    <MultiDataTrigger> 
     <MultiDataTrigger.Conditions> 
      <Condition Binding="{Binding PlacementTarget.IsMouseOver, RelativeSource={RelativeSource Self}}" Value="True" /> 
      <!-- add your other condtion here that determines whether there are any items in the Popup, e.g.: --> 
      <Condition Binding="{Binding Items.Count, RelativeSource={RelativeSource Self}}" Value="0" /> 
     </MultiDataTrigger.Conditions> 
     <MultiDataTrigger.EnterActions> 
      <BeginStoryboard x:Name="OpenPopupStoryBoard" > 
       <Storyboard> 
        <BooleanAnimationUsingKeyFrames Storyboard.TargetProperty="IsOpen" FillBehavior="HoldEnd"> 
         <DiscreteBooleanKeyFrame KeyTime="0:0:0.10" Value="True"/> 
        </BooleanAnimationUsingKeyFrames> 
       </Storyboard> 
      </BeginStoryboard> 
     </MultiDataTrigger.EnterActions> 
     <MultiDataTrigger.ExitActions> 
      <PauseStoryboard BeginStoryboardName="OpenPopupStoryBoard"/> 
      <BeginStoryboard x:Name="ClosePopupStoryBoard"> 
       <Storyboard> 
        <BooleanAnimationUsingKeyFrames Storyboard.TargetProperty="IsOpen" FillBehavior="HoldEnd"> 
         <DiscreteBooleanKeyFrame KeyTime="0:0:0.2" Value="False"/> 
        </BooleanAnimationUsingKeyFrames> 
       </Storyboard> 
      </BeginStoryboard> 
     </MultiDataTrigger.ExitActions> 
    </MultiDataTrigger> 

    <Trigger Property="IsMouseOver" Value="True"> 
     <Trigger.EnterActions> 
      <PauseStoryboard BeginStoryboardName="ClosePopupStoryBoard" /> 
     </Trigger.EnterActions> 
     <Trigger.ExitActions> 
      <PauseStoryboard BeginStoryboardName="OpenPopupStoryBoard"/> 
      <ResumeStoryboard BeginStoryboardName="ClosePopupStoryBoard" /> 
     </Trigger.ExitActions> 
    </Trigger> 
</Style.Triggers> 

Natürlich müssen Sie die zweite Bedingung ändern, um einige vorhandene Eigenschaft zu binden, der bestimmt, ob es irgendwelche Elemente anzuzeigen, aber Sie sollten die Idee.

+0

Ich danke Ihnen für die Antwort, aber aus irgendeinem Grund funktioniert das Popup überhaupt nicht in einem listboxItemTemplate, für alles andere funktioniert es. Irgendwelche Ideen? Jetzt habe ich in meinem Popup-Steuerelement eine Abhängigkeitseigenschaft "CanOpen" erstellt und der Standardwert ist "True". Ich habe den obigen Code für Condition MouseOver und CanOpen hinzugefügt - Der Name meines UserControls ist popupRoot. Und in einem anderen UserControl habe ich eine Listbox, in der ListboxItemTemplate setze ich CanOpen = True (nur um zu testen, habe ich nicht den Count). Nur für diese Listbox funktioniert es nicht. – user1702369

+0

Bitte geben Sie ein vollständig reproduzierbares Beispiel Ihres Problems an. – mm8

Verwandte Themen