2009-12-11 4 views
1

Je le déclencheur de données suivantes sur les ListBoxItems dans mon ListBox multi-sélectionWPF DataTrigger - Réglage ListBoxItem IsSelected

<DataTrigger Value="True"> 
    <DataTrigger.Binding> 
     <MultiBinding Converter="{StaticResource DisableWorkItemConverter}"> 
      <Binding ElementName="MainForm" Path="PickedWorkItemID"/> 
      <Binding Path="Id"/> 
     </MultiBinding> 
    </DataTrigger.Binding> 
    <Setter Property="IsEnabled" Value="False"/> 
    <Setter Property="IsSelected" Value="False"/> 
</DataTrigger> 

IsEnabled se prépare bien, mais IsSelected ne soit pas défini. Comment puis-je résoudre ce problème?

J'ai essayé de retirer IsEnabled pour voir s'il était en conflit avec IsSelected, mais l'élément est resté sélectionné alors qu'il ne devrait pas l'être. Juste pour réitérer, je peux dire les liaisons et le convertisseur fonctionnent bien, parce que IsEnabled fonctionne correctement. Mais, pour une raison quelconque, IsSelected ne sera pas désactivé.


Éditer: Il me vient à l'esprit que je ne veux pas que cela fonctionne comme IsEnabled. Parce que lorsque ce déclencheur évalue false, l'élément est réactivé. Je ne voudrais pas qu'une ligne précédemment non sélectionnée soit sélectionnée simplement parce que ce déclencheur n'est plus vrai.

Des idées? Fondamentalement, je ne veux pas que les lignes désactivées soient sélectionnées.


Edit 2:

J'ai essayé d'ajouter un déclencheur normale en espérant qu'il serait chaîne de la gâchette de données et cela ne fonctionne pas non plus.

<Style.Triggers> 
    <DataTrigger Value="True"> 
     <DataTrigger.Binding> 
      <MultiBinding Converter="{StaticResource DisableWorkItemConverter}"> 
       <Binding ElementName="MainForm" Path="PickedWorkItemID"/> 
       <Binding Path="Id"/> 
      </MultiBinding> 
     </DataTrigger.Binding> 
     <Setter Property="IsEnabled" Value="False"/> 
    </DataTrigger> 
    <Trigger Property="IsEnabled" Value="False"> 
     <Setter Property="IsSelected" Value="False"></Setter> 
    </Trigger> 
</Style.Triggers> 
+0

En reproduisant votre problème, j'ai trouvé que si je place le ListBoxItem IsSelected = True dans un déclencheur, je peux aussi le définir sur False dans un déclencheur. Cependant, une fois que l'utilisateur a sélectionné l'élément, le déclencheur ne changera plus IsSelected. –

+0

Hmmm, c'est intéressant. Cela ne présage rien de bon pour trouver un moyen de supprimer la sélection. Merci d'avoir regardé ça. – Vaccano

Répondre

1

Il semble qu'une fois que la « IsSelected » propriété est définie, que ce soit par l'utilisateur ou dans le code derrière, le poseur ne fonctionnera plus. Je ne suis pas sûr qu'il y ait moyen de contourner cela, mais il y a au moins un hack qui fonctionnerait dans votre cas particulier. Vous pouvez enregistrer un gestionnaire pour l'événement "IsEnabledChanged" sur votre ListBoxItem, puis vérifier votre condition de données et définir IsSelected dans le gestionnaire si les données l'appellent.

Exemple:

private void ListBoxItem_EnabledChanged(object sender, DependencyPropertyChangedEventArgs e) 
{ 
    ListBoxItem senderItem = (ListBoxItem)sender; 
    if (YourDataCondition == true) 
    { 
     senderItem.IsSelected = false; 
    } 
} 

La seule autre solution que je suis en mesure de trouver serait d'ajouter une propriété de dépendance à votre ListBoxItem, inscrivez-vous une méthode similaire à son événement « OnPropertyChanged », et changer cette propriété dans votre DataTrigger.

Voici someone else's attempt to do this que je n'ai pas encore pu vérifier.

+0

Ce lien a fait l'affaire pour moi. Merci de votre aide! – Vaccano

Questions connexes