2010-01-08 11 views
1

En application WPF J'ai un ListView qui est relié à ObservableCollection ShQuCollection par liaison de données:Comment référencer ObservableCollection à partir du gestionnaire d'événements WPF ListView SelectionChanged?

<ListView Name="ShSelList" ItemsSource="{Binding Source={StaticResource myDataSource},Path=ShQuCollection}" SelectionChanged="ShSelList_SelectionChanged"> 
    <ListView.View> 
     <GridView> 
     <GridViewColumn Header="Code" DisplayMemberBinding="{Binding StrCode}"/> 
     <GridViewColumn Header="Date" DisplayMemberBinding="{Binding Date}"/> 
     <GridViewColumn Header="Time" DisplayMemberBinding="{Binding Time}"/> 
     </GridView> 
    </ListView.View> 
</ListView> 

De l'intérieur gestionnaire d'événements ListView SelectionChanged Je dois appeler une méthode et passer à un paramètre de chaîne, prenant de l'une des le champ de la ligne sélectionnée de ObservableCollection ShQuCollection.

Comment puis-je référencer ObservableCollection depuis le gestionnaire d'événements ListView SelectionChanged?

private void ShSelList_SelectionChanged(object sender, SelectionChangedEventArgs e) 
    { 
     ...????? 
    } 

Modifié (ajouté):

Mon ObservableCollection est en code-behind fichier d'une autre fenêtre et je l'utilise Window.Resources déclaration pour y parvenir.

<Window.Resources> 
    <c:ShWindow x:Key="myDataSource"/> 
</Window.Resources> 

Et ObservableCollection ressemble:

 ObservableCollection<ShsQu> _ShQuCollection = 
      new ObservableCollection<ShsQu>(); 

    public ObservableCollection<ShsQu> ShQuCollection 
    { get { return _ShQuCollection; } } 

    public class ShsQu 
    { 
     public string StrCode { get; set; } 
     public string Date { get; set; } 
     public string Time { get; set; } 
    } 

Répondre

1

Je suppose votre MODELVIEW est attaché à votre vue. Signification ShQuCollection doit être une propriété publique dans votre ModelView. Vous devriez simplement avoir accès au ObservableCollection via votre ModelView.

Mise à jour:

Pour atteindre l'enregistrement dans lequel vous devez vous modifier saisir les selectedIndex actuelle de votre listView.

private void ShSelList_SelectionChanged(object sender, SelectionChangedEventArgs e) 
{ 
    string s = ShQuCollection[ShSelList.SelectedIndex].StrCode; 
} 

Note: Il serait plus propre à l'avenir d'utiliser l'approche MVVM.

+0

Malheureusement, je n'ai pas encore assez appris MVVM et ma collection est dans le fichier code-behind de la fenêtre. Y a-t-il un moyen de sortir dans ce cas? – rem

+0

Pouvez-vous mettre à jour votre question pour inclure le code de l'endroit où vous déclarez votre ObservableCollection? – jsmith

+0

J'ai inclus dans ma question mise à jour la déclaration de ma collection. Et une chose à noter: je n'ai pas besoin de simplement référencer ma collection du gestionnaire d'événements mais d'atteindre cet enregistrement qui est maintenant sélectionné après SelectionChanged. – rem

0

Dans votre code, vous devriez pouvoir convertir la propriété d'élément sélectionné de la liste (SsSelList) en un objet ShsQu et accéder aux propriétés de cet objet pour appeler votre méthode.

ShSQu obj = SsSelList.SelectedItem as ShSQu; 
// Then call the method using the object properties 
MethodToCall(obj.StrCode); 

Ceci devrait fonctionner cependant n'est pas une manière très propre de faire ceci et je recommanderais d'employer le modèle de MVVM. Si vous utilisiez MVVM, vous stockez votre collection dans le viewmodel et gardez trace de l'élément actuel dans le viewmodel. De cette façon, toute commande qui est levée dans le viewmodel peut accéder à l'élément en cours. Josh Smith donne une bonne introduction ici (http://msdn.microsoft.com/en-us/magazine/dd419663.aspx) à MVVM si vous êtes intéressé à lire plus loin.

+0

Merci pour le lien, je vais sûrement apprendre cette chose importante Malheureusement, je ne peux pas faire de casting selon votre exemple, il ne compile pas dans mon code, peut-être quelque chose manque – rem

+0

Désolé, c'était idiot de moi, l'objet est un mot-clé et ne devrait pas être utilisé pour un changement de nom de variable l'objet de nom de variable à obj – mattythomas2000