2017-01-30 2 views
0

J'avais auparavant un ListView qui affichait une ObservableCollection de propriétés d'objet "Player", que j'essaye de convertir en un DataGrid. J'ai la plupart du temps de travail, mais actuellement avoir quelques problèmes avec voir des changements sur une propriété particulière (État), qui est représenté par un ComboBox. L'idée est de permettre aux joueurs de remplacer la valeur "Status" entre un ensemble d'énumérations représentant des choses comme "Alive, Dead, Poisoned", etc. J'ai connecté un EventHandler pour quand le ComboBox est fermé et à l'intérieur de ce gestionnaire, essayez saisir l'objet expéditeur en tant que joueur afin que je puisse envoyer les valeurs de joueur valides.Je cherchais à obtenir l'élément actuellement sélectionné d'un DataTemplate ComboBox dans un DataGrid à partir d'un gestionnaire d'événements DropDownClosed

Voici un extrait du code XAML dans lequel je crée le composant ComboBox via un DataTemplate.

<DataGridTemplateColumn Header="Status"> 
    <DataGridTemplateColumn.CellEditingTemplate> 
     <DataTemplate> 
      <ComboBox Name="cbStatus" 
         ItemsSource={Binding Source={StaticResource statusTypes}}" 
         SelecteItem="{Binding statusType, Mode=TwoWay}" 
         DropDownClosed="cbStatusType_DropDownClosed"/> 
     </DataTemplate> 
    </DataGridTemplateColumn.CellEditingTemplate> 
</DataGridTemplateColumn> 

A l'intérieur du gestionnaire d'événements, je suis en utilisant ce qui suit pour essayer de saisir un objet « Player » sur la base des valeurs qui reviennent de cette ligne particulière de l'interface graphique.

Player playerOverridden = (Player)(sender as FrameworkElement).DataContext; 

Cependant, quand je suis mise au point du nouveau playerOverridden lorsque le ComboBox ferme et une nouvelle valeur est sélectionnée, je ne vois pas que la valeur d'être capturé dans playerOverridden.

C'est à peu près exactement ce que je faisais dans un ListView avec GridViewColumn.CellTemplates et ça fonctionnait très bien. Vous ne savez pas pourquoi la valeur Status revient à la valeur initiale définie à la place de ce que le lecteur a sélectionné dans la zone de liste déroulante.

Répondre

0

A dû mettre le UpdateSourceTrigger sur le SelectedItemBinding pour être PropertyChanged, cela fonctionne. Je ne sais pas pourquoi cela doit être défini explicitement dans un DataGrid où ce n'est pas quelque chose que je devais faire dans le ListView.

SelectedItem={"Binding statusType, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"