7
votes

WPF DataGrid: Sur charge, sélection sur l'élément actuel (sur la surbrillance)

J'ai un fichier de données WPF reliée à certaines propriétés de mon point de vue xxx

lorsque ma fenêtre charge et le datagramrid aussi, je définis aussi le SELECTELITEM et il se lie bien. Mais la rangée n'est pas mise en évidence. Au moment où je clique sur une ligne, la ligne en surbrillance et le problème est résolu.

Comment puis-je définir / déclencher la surbrillance du SELECTELTEMITEM dans le Datagramrid sur la charge / l'initialisation?

edit: < / P>

Il est effectivement sélectionné car j'ai la petite cellule de sélection. C'est juste le rendu de la surbrillance qui ne déclenche pas.

Entrez la description de l'image ici <> < / p>


0 commentaires

5 Réponses :


7
votes

Lorsque vous utilisez un modèle en tant que modèle DataContext pour une fenêtre WPF, l'événement CODE> CORETCHANGED BLOPLANGED CORE> NE PAS appelé qu'après la charge de la fenêtre, c'est pourquoi la ligne n'est jamais mise en surbrillance et vous ne voyez que le première rangée avec le point culminant partiel. Il peut y avoir une manière plus élégante, mais voici une œuvre de travail.

Dans l'événement chargé de la fenêtre ou l'événement chargé de la fenêtre, réinitialisez la liaison sélectionnée SELECTEMEM: P>

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

namespace WpfDataGridHighlightOnLoad
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();   
            this.Loaded += new RoutedEventHandler( OnLoaded );
        }

        // could also be placed in the DataGrid's loaded event handler
        private void OnLoaded( object sender, RoutedEventArgs e )
        {
            if( dataGrid != null && Model.SelectedItem != null )
            {
                var selected = Model.SelectedItem;
                Model.SelectedItem = null;
                Model.SelectedItem = selected;
            }
        }

        private void OnCycleClick( object sender, RoutedEventArgs e )
        {
            int index = Model.ItemList.IndexOf( Model.SelectedItem );
            index = index == Model.ItemList.Count - 1 ? 0 : index + 1;
            Model.SelectedItem = Model.ItemList[index];
        }

        private void OnResetClick( object sender, RoutedEventArgs e )
        {
            Model.Reset();
        }
    }

    public class MainWindowModel : INotifyPropertyChanged
    {
        public MainWindowModel()
        {
            Reset();
        }

        public void Reset()
        {
            ItemList = new List<Person>
                           {
                               new Person("Joe", 20),
                               new Person("John", 30),
                               new Person("Jane", 40),
                               new Person("Jill", 50),
                               new Person("Fido", 7),
                           };

            SelectedItem = ItemList[2];
        }

        private Person _selectedItem;
        public Person SelectedItem
        {
            get { return _selectedItem; }
            set
            {
                _selectedItem = value;
                NotifyPropertyChanged( "SelectedItem" );
            }
        }

        private List<Person> _itemList;
        public List<Person> ItemList
        {
            get { return _itemList; }
            set
            {
                _itemList = value;
                NotifyPropertyChanged( "ItemList" );
            }
        }

        #region INotifyPropertyChanged Members

        public event PropertyChangedEventHandler PropertyChanged;

        private void NotifyPropertyChanged( String info )
        {
            if( PropertyChanged != null )
            {
                PropertyChanged( this, new PropertyChangedEventArgs( info ) );
            }
        }

        #endregion
    }

    public class Person
    {
        public string Name { get; set; }
        public int Age { get; set; }

        public Person( string name, int age )
        {
            Name = name;
            Age = age;
        }

        public override string ToString()
        {
            return Name;
        }
    }
}


4 commentaires

Il n'y a pas de chargé événement sur uielement


DataGrid Hérités de Contrôles Qui a un événement chargé : MSDN DataGrid Events


@Smurf - Réinitialiser SeceeTeTem a résolu un problème que j'ai essayé de comprendre pendant quelques jours. Merci!!!


Cela fonctionne la première fois sur le chargement. Mais lorsque je change la valeur de viewModel, cela ne souligne toujours pas la bonne ligne. bien que ce soit sélectionné.



8
votes

J'ai eu le même "problème" et j'ai finalement trouvé une très bonne solution au problème. Comme vous l'avez déjà dit, ce n'est pas si la ligne n'est pas sélectionnée mais qu'elle ne met pas en évidence la ligne. Si vous regardez soigneusement, vous remarquerez que lorsque vous cliquez sur n'importe où dans la ligne (à l'aide de la souris), il ne met toujours pas en surbrillance la ligne, seules les cellules à l'intérieur.

donc 2 options;

  • Créez le code pour sélectionner les cellules de la ligne
  • ou créez un style.trigger pour mettre en surbrillance la ligne (qui est la meilleure option dans mon esprit).

    Pour ce faire, ajoutez quelque chose comme celui-ci au Datagramrid dans le fichier XAML: xxx

    espère que cela aide!

    Acclamations, Ltb


0 commentaires

0
votes

Ceci est un peu ancien, mais aucune des réponses dans n'importe quel post ne semble l'obtenir tout à fait raison. Ce que vous voulez, c'est que cela fonctionne comme il était censé fonctionner: c'est-à-dire que la mise en évidence est la même chose si le contrôle a déjà été concentré (ce qui semble être quelque chose d'accessoire).

Ceci peut être fait avec un DataGridrow Code> Style, mais l'astuce ne veut pas spécifier les couleurs vous-même, mais pour utiliser les couleurs par défaut, tout fonctionne simplement. Une gêne supplémentaire vient du fait que ce sont les cellules qui sont en surbrillance, pas les lignes, donc vous avez essentiellement besoin de dupliquer le style de surbrillance de la cellule: P>

<Style
    x:Key="DataGridRowStyle"
    TargetType="{x:Type DataGridRow}">
    <Style.Triggers>
        <MultiTrigger>
            <MultiTrigger.Conditions>
                <Condition
                    Property="IsKeyboardFocusWithin"
                    Value="False" />
                <Condition
                    Property="IsSelected"
                    Value="True" />
            </MultiTrigger.Conditions>
            <Setter
                Property="Background"
                Value="{DynamicResource
                    {x:Static SystemColors.InactiveSelectionHighlightBrushKey}}" />
            <Setter
                Property="Foreground"
                Value="{DynamicResource
                    {x:Static SystemColors.InactiveSelectionHighlightTextBrushKey}}" />
        </MultiTrigger>
        <MultiTrigger>
            <MultiTrigger.Conditions>
                <Condition
                    Property="IsKeyboardFocusWithin"
                    Value="True" />
                <Condition
                    Property="IsSelected"
                    Value="True" />
            </MultiTrigger.Conditions>
            <Setter
                Property="Background"
                Value="{DynamicResource
                    {x:Static SystemColors.HighlightBrushKey}}" />
            <Setter
                Property="Foreground"
                Value="{DynamicResource
                    {x:Static SystemColors.HighlightTextBrushKey}}" />
        </MultiTrigger>
    </Style.Triggers>
</Style>


0 commentaires

0
votes

a couru sur le même problème, lors de l'insertion de données factices dans un DataGrid WPF, puis essayez de modifier la commande de ligne. La rangée Hightlighting est classée (image ci-dessous).

cause insertion de l'objet "même" d'enregistrement exact plusieurs fois.

 entrer la description de l'image ici xxx


0 commentaires

0
votes

Je sais que ce fil est super vieux, mais aucune des solutions m'a aidé.

Si quelqu'un a le même problème, une solution très simple que j'ai trouvée était de définir simplement la mise au point sur le DataGrid avant de définir son élément choisi sur la charge. xxx


0 commentaires