2010-08-30 2 views
1

J'ai une longue liste d'articles que je voudrais filtrer. J'ai ajouté une propriété IsFiltered au modèle de vue dans ma liste. En utilisant un ItemContainerStyle je suis capable de lier la visibilité de ListViewItem à la propriété IsFiltered.Est-il possible de dire à la liaison WPF de répondre de manière asynchrone à un événement PropertyChanged (priorité basse)?

<ListView ItemsSource="{Binding Path=MyItems}"> 
    <ListView.ItemContainerStyle> 
     <Style TargetType="{x:Type ListViewItem}"> 
      <Style.Triggers> 
       <DataTrigger Binding="{Binding Path=IsFiltered}" Value="True"> 
       <Setter Property="Visibility" Value="Collapsed"/> 
       </DataTrigger> 
      </Style.Triggers> 
     </Style> 
    </ListView.ItemContainerStyle> 
</ListView> 

Tout fonctionne correctement et la modification de la propriété IsFiltered reflète correctement l'interface utilisateur. J'exécute un processus en arrière-plan pour déterminer quels éléments filtrer et quand il termine la propriété IsFiltered de chaque élément de modèle de vue est mis à jour sur le thread d'interface utilisateur. Le problème est qu'en raison du nombre élevé d'événements PropertyChanged en cours d'exécution, il y a une pause très perceptible. J'ai réussi à atténuer cela en utilisant

public bool IsFiltered 
{ 
    get 
    { 
     return m_IsFiltered; 
    } 
    set 
    { 
     if (m_IsFiltered == value) 
     { 
      return; 
     } 
     m_IsFiltered = value; 
     Dispatcher.CurrentDispatcher.BeginInvoke(
      DispatcherPriority.Background, 
      (System.Action)(() => RaisePropertyChanged("IsFiltered"))); 
    } 
} 

dans le modèle de vue. Le RaisePropertyChanged soulève simplement l'événement PropertyChanged.

Je tente de restreindre la connaissance de l'infrastructure d'interface utilisateur (WPF) à partir du modèle de vue. Dans ce cas, je voudrais juste avoir l'appel RaisePropertyChanged et en quelque sorte donner à l'interface utilisateur la responsabilité d'écouter le changement de propriété d'une manière asynchrone. Est-ce possible? Il n'est pas très important que l'événement soit traité car la propriété modifiée est renvoyée.

J'ai essayé d'ajouter IsAsync = True à la liaison du DataTrigger, mais cela n'a pas l'effet escompté.

Répondre

0

IsAsync est bon, mais vous devez déterminer correctement lequel de vos changements de propriétés (causé par l'assignation de nouvelles données) nécessite une tâche longue, puis placez-le là. CMIIW IsAsync sur votre liaison de déclenchement de données n'a pas fonctionné car pour effectuer des modifications sur IsFiltered est seulement une tâche simple ne nécessite pas de tâche en cours d'exécution.

donc trouver celle qui du changement de la propriété peut-être eu tâche longue de course a mis leIsAsync = Truelà.

Espérons que cela vous aide.

+0

Cela n'aide pas vraiment. Comme vous le faites remarquer à juste titre, obtenir un bool n'est pas vraiment une opération lente. Le problème est que j'ai créé une situation où un grand nombre d'événements PropertyChanged sont déclenchés à la fin d'une opération en bloc. Je vais probablement devoir scinder l'opération en bloc, ce qui va également découper les mises à jour IsFiltered et permettre au reste de l'interface utilisateur de mettre à jour également. Je ne pense pas que je veuille essayer IsAsync, puisqu'il n'était pas vraiment destiné à ce genre d'utilisation. – Christo

Questions connexes