Cuando se utiliza un modelo como el DataContext para una ventana de WPF, el evento de la cuadrícula de datos SelectionChanged
no se consiga llamar hasta después de la ventana se carga por lo que la fila no se destacó y sólo se ve la primera fila con el resaltado parcial. Puede haber una manera más elegante, pero aquí hay una solución alternativa.
En caso de carga de la ventana o evento cargado de la cuadrícula de datos, restablecer la unión SelectedItem:
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;
}
}
He aquí una muestra de trabajo completo.
XAML
<Window x:Class="WpfDataGridHighlightOnLoad.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:model="clr-namespace:WpfDataGridHighlightOnLoad"
Title="MainWindow" Height="350" Width="525">
<Window.DataContext>
<model:MainWindowModel x:Name="Model" />
</Window.DataContext>
<Grid>
<DataGrid AutoGenerateColumns="True" SelectionMode="Single"
HorizontalAlignment="Stretch"
Name="dataGrid"
VerticalAlignment="Top"
ItemsSource="{Binding ItemList}"
SelectedItem="{Binding SelectedItem}">
</DataGrid>
<Button Content="Cycle Selection" Click="OnCycleClick"
Height="23"
HorizontalAlignment="Right"
Name="button1"
VerticalAlignment="Bottom" Width="125" />
<Button Content="Reset Grid" Click="OnResetClick"
Height="23"
HorizontalAlignment="Left"
Name="button2"
VerticalAlignment="Bottom" Width="125" />
</Grid>
</Window>
Código Detrás
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;
}
}
}
No hay evento '' Loaded' en UIElement' –
'' DataGrid' hereda de Controls' el cual tiene un evento 'Loaded': [MSDN DataGrid Eventos] (http: // msdn.microsoft.com/en-us/library/system.windows.controls.datagrid_events.aspx) –
@Smurf - restableciendo SelecteItem ha resuelto un problema que he intentado comprender durante un par de días. ¡¡¡Gracias!!! – GilShalit