2010-11-08 2 views
1

J'ai une listbox représentant une instruction SQL WHERE et les éléments à l'intérieur peuvent être groupés.Réévaluer un MultiConverter lorsqu'un paramètre change?

Par exemple, un utilisateur peut avoir les éléments suivants dans leur ListBox

alt text

Je voudrais montrer la valeur et/ou que si l'élément ListBox n'est pas le premier élément dans la liste ou un groupe (comme exemple). J'utilise actuellement un MultiConverter sur le ItemTemplate de la ListBox qui accepte les ItemSource de ListBox et les Current Item en tant que paramètres, cependant les articles existants n'obtiennent pas leur visibilité AND/OR mise à jour quand l'utilisateur ajoute un nouvel article, ou fait glisser un item existant vers un nouveau place dans la liste.

Existe-t-il un moyen de demander au MultiConverter de réévaluer lorsque l'un de ses paramètres, ItemSource de ListBox, change? J'utilise MVVM et le ListBox est lié à un ObservableCollection d'éléments.

Mise à jour Code comme demandé par Adam ...

<ListBox x:Name="WhereList" ItemsSource="{Binding Path=CurrentQuery.WhereList}">   
    <ListBox.Style> 
     <Style TargetType="{x:Type ListBox}"> 
      <Setter Property="ItemTemplate"> 
       <Setter.Value> 
        <DataTemplate> 
         <StackPanel Orientation="Horizontal" HorizontalAlignment="Stretch" 
            Margin="{Binding Path=Depth, Converter={StaticResource QueryBuilder_DepthToMarginConverter}}"> 
          <Label Content="{Binding Path=BooleanComparison}" Padding="0"> 
           <Label.Visibility> 
            <MultiBinding Converter="{StaticResource ShouldShowOperatorConverter}"> 
             <Binding ElementName="WhereList" Path="ItemsSource"/> 
             <Binding /> 
            </MultiBinding> 
           </Label.Visibility> 
          </Label> 

          <Label Content="{Binding ConditionText}" Padding="0" HorizontalAlignment="Stretch" /> 
         </StackPanel> 
        </DataTemplate> 
       </Setter.Value> 
      </Setter> 
     </Style> 
    </ListBox.Style> 
</ListBox> 

Le MultiConverter accepte une liste d'éléments, et l'élément en cours. Il vérifie si l'élément est le premier élément de la liste ou si l'élément précédent de la liste est un élément GroupStart. Si l'une de ces conditions est remplie, elle renvoie Visibility.Collapsed, sinon elle renvoie Visibility.Visible. Il fonctionne correctement pour le premier chargement et les modifications apportées à un seul élément (en faisant glisser un nouvel élément dans la liste, ou en faisant glisser un élément existant vers un nouvel emplacement dans la liste) mettront à jour correctement le nouvel élément ET/OU visibilité, cependant il ne change aucun autre élément que celui qui est ajouté/déplacé. Donc, si vous faites glisser un nouvel élément en haut de la liste, il masquera correctement le ET/OU du nouvel élément, mais il ne mettra pas à jour le deuxième élément (ancien premier élément) pour afficher le ET/OU. Cela affecte vraiment la lisibilité des éléments de la liste et empêche l'utilisateur de voir s'ils lient actuellement l'élément avec un ET ou un OR qui fait une grande différence dans les résultats renvoyés. Je suis assez sûr que cela a quelque chose à voir avec le fait que j'utilise un MultiConverter depuis que mon DepthToMarginConverter fonctionne bien (par exemple, regrouper les éléments correctement met à jour la marge de tous les éléments dans le groupe).

Répondre

0

Je ne peux pas trouver un moyen d'obtenir mon MultiConverter pour se rafraîchir lorsque l'un des paramètres changent (oui, il met en œuvre INotifyPropertyChange) donc j'ai fini juste d'ajouter une propriété à mon article de IsBooleanOperatorShown et en utilisant un convertisseur BooleanToVisibility régulier

0

Vous devez déclencher l'événement PropertyChanged sur ItemsSource de ListBox dans le ViewModel. Si votre classe de base ViewModel a une méthode RaisePropertyChanged ou une autre aide INOtifyPropertyChanged, relancez cette opération sur votre collection. Cela devrait obliger ListBox à actualiser ses données et à les réexécuter à travers les convertisseurs.

+0

ItemsSource est une ObservableCollection qui déclenche déjà l'événement PropertyChanged lorsqu'un nouvel élément est ajouté/supprimé. Juste au cas où, j'ai appelé l'événement PropertyChange manuellement et il n'a toujours pas réévalué le convertisseur. – Rachel

+0

ObservableCollection déclenche PropertyChanged lorsque la collection elle-même est modifiée (comme vous l'avez dit - les éléments sont ajoutés ou supprimés), elle ne l'augmente pas si un élément de la collection se modifie lui-même. C'est pourquoi vous devriez le soulever vous-même. Aurait pensé que cela aurait fonctionné. Pouvez-vous fournir du code? –

+0

J'ai ajouté du code.Je pense que cela a à voir avec le MultiConverter puisque dans ce cas la collection elle-même est changée - de nouveaux objets sont glissés dedans ou un élément est retiré et réinséré à un nouvel index. Je sais que l'événement PropertyChanged est exécuté car ListBox affiche les éléments nouveaux/supprimés. Les éléments sont également mis à jour correctement lorsqu'une propriété est modifiée, telle que leur valeur, l'opérateur ET/OU, les regroupements/profondeur/marge des éléments, etc. – Rachel