2010-09-22 6 views
4

J'ai un (principal) Window contenant un Frame. Un Page est chargé à Frame, avec viewmodel comme son datacontext.Datagrid SelectedItem perdu sur window.IsEnabled = false

La vue a quelques datagrids, où l'on est lié à la viewmodel et l'autre est lié à la selected.item (de sorte que vous obtenez une vue maître-détails ..)

le problème se produit lorsque j'affichage une boîte popup, et définissez le mainwindow IsEnabled = false. Lorsque cela se produit, l'élément sélectionné de la grille de données liée au modèle de vue est désélectionné, et bien sûr les autres éléments sélectionnés de la grille de données sont également désélectionnés.

Comment conserver l'état de l'interface utilisateur lorsque mon mainwindow.IsEnabled est défini sur false?

Répondre

0

Il semble que le comportement interne de la grille de données consiste à désélectionner l'élément sélectionné lorsque la grille de données est désactivée - je viens de la vérifier moi-même.

Mais essayez ceci:

Créer une ListView simpliste, ajouter des données, sélectionnez un élément, cliquez sur un bouton pour désactiver le ListView. Si l'élément sélectionné est désélectionné, ce comportement est inhérent à WPF. Je ne pense pas que vous puissiez faire grand-chose à ce sujet. Autres que ne pas désactiver vos contrôles ...

Si l'élément sélectionné n'est pas désélectionné, vous pouvez ouvrir un bogue dans Connect. Cela peut prendre des mois pour obtenir une réponse et un correctif "pourrait" arriver dans quelques années ... Si une telle attente n'est pas une option, publiez aussi un bug dans la boîte à outils WPF (wpf.codeplex.com). La boîte à outils pourrait être mise à jour plus tôt.

0

C'est le comportement attendu, et de par sa conception, mais il est à la fois inattendu et ennuyeux et beaucoup de gens pensent qu'il devrait être supprimé. La solution de contournement pour créer une nouvelle classe DataGrid qui hérite de DataGrid qui a modifié le comportement de cet événement.

XAML

<DataGrid x:Class="MyDataGrid" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
     xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
     mc:Ignorable="d"> 
</DataGrid> 

code Derrière

public partial class MyDataGrid : DataGrid 
{ 
    public MyDataGrid() 
    { 
    InitializeComponent(); 
    } 

    static MyDataGrid() 
    { 
    IsEnabledProperty.OverrideMetadata(
     typeof(MyDataGrid), 
     new FrameworkPropertyMetadata(OnIsEnabledChanged)); 
    } 

    private static void OnIsEnabledChanged(
    DependencyObject d, 
    DependencyPropertyChangedEventArgs e) 
    { 
    d.CoerceValue(CanUserAddRowsProperty); 
    d.CoerceValue(CanUserDeleteRowsProperty); 

    CommandManager.InvalidateRequerySuggested(); 
    } 
} 

Voir http://wpf.codeplex.com/workitem/13022

1

Si vous voulez ajouter un peu de folie au mélange. Après avoir installé VS 2011 Beta (qui remplace le framework .NET 4.0 par .NET 4.5) j'ai créé une petite application de test avec VS 2010 qui cible 4.0 et le comportement de ceci a changé encore une fois pour ne pas définir SelectedItem = null quand la grille est désactivé Je ne sais pas si cela le fera dans la version finale de 4.5 ou pas ....

+0

Oh, c'est pourquoi une machine avec W7 est définie sur null et les autres ne le font pas. Il semble que c'est un comportement par défaut de ne pas mettre à null depuis Net 4.5 –

Questions connexes