2010-07-26 7 views
1

J'ai une action Edit dans mon application WPF, qui est liée aux éléments d'un contrôle ListView, c'est-à-dire qu'elle est exécutée lorsqu'un élément est double-cliqué ou le bouton Edit dans la barre d'outils est cliqué. Cette action affiche à son tour une fenêtre modale avec les trucs d'édition.WPF: éléments ListView sélectionnés après l'affichage d'une boîte de dialogue

Maintenant, lorsque je sélectionne plusieurs éléments dans la liste, cliquez sur Modifier, les éléments restent sélectionnés en arrière-plan, aussi, lorsque je ferme la boîte de dialogue, ils sont toujours sélectionnés dans le sens que leur arrière-plan est bleu. Cependant, ils semblent ne pas être sélectionnés dans le sens que le bouton Éditer est désactivé dans la barre d'outils (la méthode CanExecute de l'action Éditer vérifie simplement FileList.SelectedIndex != -1. De plus, les éléments "sélectionnés" ne seront pas désélectionnés lorsque je clique sur un autre élément de liste - ils ne sont désélectionnés que lorsque je les clique explicitement un par un - c'est comme si l'arrière-plan bleu leur était collé

Mon code n'utilise pas de styles fantaisie ListView ou autre, alors qu'est-ce qui pourrait être à l'origine de cela? Je peux poster mon code sur demande, mais il est à peu près standard

EDIT:.

Après avoir coupé mon code, j'ai finalement trouvé ce qui causait ce problème. Après avoir affiché la boîte de dialogue, je modifie les éléments de la collection de données liées, de sorte que ListView soit mis à jour (c'est-à-dire remplace les objets liés par de nouveaux objets). La question est: pourquoi cela pose-t-il un problème et comment dois-je le résoudre?

+0

Comment éditez-vous les éléments? Les remplacer ou simplement changer les propriétés? Il se passe quelque chose dans votre code qui provoque le comportement que vous rencontrez. –

+1

Je les remplace par de nouveaux articles. J'ai découvert que cela invalide la propriété SelectedItems de la liste, c'est-à-dire que l'arrière-plan reste bleu sur les éléments sélectionnés, mais que les nouveaux éléments ne sont pas techniquement sélectionnés (pas dans la liste), ils ne sont pas traités comme tels. J'ai résolu le problème en ajoutant les nouveaux objets dans la collection SelectedItems. –

Répondre

0

Quelque chose dans votre code doit être à l'origine de ce problème. Voici un exemple qui se comporte comme prévu.

XAML:

<Window x:Class="TestDemo.MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Title="Window1" Height="300" Width="300"> 

    <Window.Resources> 
     <RoutedUICommand x:Key="EditItemsCommand" Text="Edit Items" /> 
    </Window.Resources> 

    <Window.CommandBindings> 
     <CommandBinding 
      Command="{StaticResource EditItemsCommand}" 
      CanExecute="EditItems_CanExecute" 
      Executed="EditItems_Executed" /> 
    </Window.CommandBindings> 

    <StackPanel> 
     <Button Name="_editButton" Content="Edit" Command="{StaticResource EditItemsCommand}" /> 
     <Button Content="Unselect all" Click="OnUnselectAll" /> 
     <ListView 
      Name="_listView" 
      ItemsSource="{Binding Path=Items}" 
      SelectionMode="Extended" 
      MouseDoubleClick="OnListViewMouseDoubleClick"> 
     </ListView> 
    </StackPanel> 
</Window> 

code derrière:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Windows; 
using System.Windows.Input; 

namespace TestDemo 
{ 
    public partial class MainWindow : Window 
    { 
     public MainWindow() 
     { 
      InitializeComponent(); 

      DataContext = this; 
     } 

     public IEnumerable<string> Items 
     { 
      get 
      { 
       for (int i = 0; i < 10; i++) { yield return i.ToString(); } 
      } 
     } 

     private void EditItems_CanExecute(object sender, CanExecuteRoutedEventArgs e) 
     { 
      e.CanExecute = _listView != null && _listView.SelectedItems.Count > 0; 
     } 

     private void EditItems_Executed(object sender, ExecutedRoutedEventArgs e) 
     { 
      EditWindow editWindow = new EditWindow(); 
      editWindow.EditItems = _listView.SelectedItems.Cast<string>(); 
      editWindow.ShowDialog(); 
     } 

     private void OnListViewMouseDoubleClick(object sender, MouseButtonEventArgs e) 
     { 
      _editButton.Command.Execute(null); 
     } 

     private void OnUnselectAll(object sender, RoutedEventArgs e) 
     { 
      _listView.SelectedItem = null; 
     } 
    } 
} 

XAML:

<Window x:Class="TestDemo.EditWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Title="EditWindow"> 
    <ListBox ItemsSource="{Binding Path=EditItems}" /> 
</Window> 
code

derrière:

using System; 
using System.Collections.Generic; 
using System.Windows; 

namespace TestDemo 
{ 
    public partial class EditWindow : Window 
    { 
     public EditWindow() 
     { 
      InitializeComponent(); 

      DataContext = this; 
     } 

     public IEnumerable<string> EditItems { get; set; } 
    } 
} 
+0

Vous avez raison, voir ma modification. –

0

Que possédez-vous pour ListView.SelectionMode? Cela semble être Multiple (cliquer sur un élément pour étendre la sélection), tandis que Extended (la sélection est étendue en cliquant sur un élément et en appuyant sur Ctrl ou Maj) à la place.

Je ne sais pas quoi dire au sujet du problème de commande d'édition, cependant. Peut-être qu'il ya un comportement étrange avec SelectedIndex et la sélection multiple - peut-être vérifier le nombre d'objets dans la collection ListView.SelectedItems à la place?

+0

SelectionMode est étendu - il fonctionne comme prévu tant que je n'affiche aucune boîte de dialogue modale. Et SelectedIndex est égal au premier élément sélectionné lorsque plusieurs éléments sont sélectionnés, puisque la visibilité du bouton Modifier correspond correctement à la sélection d'éléments (même quelques-uns). –

Questions connexes