2010-08-20 6 views
0

J'ai un ListView avec un CheckBox comme l'une des colonnes, lié à une propriété booléenne d'un objet personnalisé. J'essaie de comprendre comment parcourir les éléments dans le ListView et cochez toutes les cases. Ce que j'ai à ce jour est ci-dessous:WPF parcourir des éléments dans une vue de liste

XAML:

<ListView x:Name="MyListView" DockPanel.Dock="Top" Height="275" IsSynchronizedWithCurrentItem="True" ItemsSource="{Binding}"> 
    <ListView.View> 
     <GridView> 
      <GridViewColumn Header="Enabled"> 
       <GridViewColumn.CellTemplate> 
        <DataTemplate> 
         <CheckBox IsChecked="{Binding Path=IsChecked}" Click="CheckBox_Click" /> 
        </DataTemplate> 
       </GridViewColumn.CellTemplate> 
      </GridViewColumn> 
     </GridView> 
    </ListView.View> 
</ListView> 

VB.NET:

Private Sub SelectAll_Click(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs) Handles SelectAll.Click 
    Dim currSelected As Integer = MyListView.SelectedIndex 
    MyListView.SelectAll() 
    For ixItem As Integer = 0 To MyListView.SelectedItems.Count - 1 
     coItems(ixItem).IsChecked = True 
    Next 
    MyListView.SelectedIndex = currSelected 
End Sub 

J'ai le pressentiment que c'est en fait assez facile, et je manque juste une ligne quelque part. Merci pour l'aide! Le problème est plus particulièrement que les cases à cocher qui sont visibles lorsque le bouton est enfoncé ne sont pas affichées comme cochées, mais celles qui ne sont pas visibles (parce que l'utilisateur doit faire défiler vers le bas pour voir eux) sont affichés comme cochés.

MISE À JOUR 2: Comme demandé, voici le code PropertyChanged. Je suis encore assez nouveau à WPF, je n'ai pas fait beaucoup avec INotifyPropertyChanged auparavant.

Public Property blnIsChecked() As Boolean 
     Get 
      Return _blnIsChecked 
     End Get 
     Set(ByVal value As Boolean) 
      _blnIsChecked = value 
     End Set 
    End Property 

Public Event PropertyChangedHandler(ByVal sender As Object, ByVal e As System.ComponentModel.PropertyChangedEventArgs) Implements System.ComponentModel.INotifyPropertyChanged.PropertyChanged 
+0

Si vous déclenchez l'événement CheckAll, demandez à votre programme de redessiner l'écran (par exemple, en minimisant le programme et en le réouvrant), les éléments apparaissent-ils comme cochés? – Rachel

+0

Oui, en fait. Il y a des articles qui sont en dessous du pli, et ceux-ci semblent vérifiés. (c.-à-d.: les cases à cocher qui ne sont pas visibles lorsque le bouton est enfoncé sont cochées) – Riddari

Répondre

0

Vous pouvez accéder aux éléments de la liste sans utiliser SelectedItems, utilisez simplement ListView.Items. De cette façon, vous n'avez pas à changer la sélection.

Votre modèle sous-jacent ne déclenche pas correctement les notifications de modification de propriété? sinon, vous définissez IsChecked sur eux, mais ils ne disent rien à la liste.

Qu'est-ce spécifiquement ne fonctionne pas?

+0

Voir la question mise à jour. Merci. – Riddari

+0

cela impliquerait pour moi que vos notifications de modification de propriété ne tirent pas correctement sur votre objet personnalisé. Si votre liste est "virtualisée", celles qui se trouvent "sous le pli" n'existent pas réellement tant que vous ne les faites pas défiler. Lorsqu'elles sont créées, elles ont la valeur "correcte". Je m'assurerais que votre objet personnalisé effectue correctement les notifications de modification de propriété sur sa propriété IsChecked. Pouvez-vous poster/mettre à jour une partie de cela dans la question? –

Questions connexes