2011-09-14 25 views
7

Para reproducir este problema, agregue un control de usuario, pegue el xaml a continuación y luego agregue una instancia a una ventana. Finalmente establezca el contexto de datos de la ventana en una instancia de ADummyDataContext (también abajo)Wpf DataGrid problema

Cuando ejecuta la aplicación por primera vez, debe obtener una cuadrícula con tres categorías, cada una con un gato. Si hace clic en cualquiera de las dos categorías inferiores y hace clic en un nombre de gato, aparecerá una fila azul que muestra solo el nombre del gato.

Sin embargo, si hace clic en la primera fila y hace clic en la fila del gato, la fila azul no aparecerá. NOTA: Esto solo ocurre la primera vez que ejecuta la aplicación. Tan pronto como haga clic en cualquier otro gato, el gato en la primera categoría funcionará como se espera.

<UserControl x:Class="WpfUserControls.SimpleGridControl" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     Background="#FFE46400"> 
<Grid Margin="2,2,2,2"> 
    <Grid.RowDefinitions> 
     <RowDefinition Height="26" MaxHeight="26" MinHeight="26" /> 
     <RowDefinition /> 
     <RowDefinition Height="26" MaxHeight="26" MinHeight="26" /> 
    </Grid.RowDefinitions> 
    <Grid.ColumnDefinitions> 
     <ColumnDefinition /> 
    </Grid.ColumnDefinitions> 
    <ToolBar Grid.Row="0"> 
     <Button Content="Button" Name="button1" VerticalAlignment="Center" Width="75" /> 
     <Button Content="Button" Name="button2" VerticalAlignment="Center" Width="75" /> 
    </ToolBar> 
    <DataGrid CanUserAddRows="False" ItemsSource="{Binding Path=KittensView}" AutoGenerateColumns="True" Grid.Row="1" HorizontalAlignment="Stretch" Name="dataGrid1" VerticalAlignment="Stretch"> 
     <DataGrid.GroupStyle> 
      <GroupStyle> 
       <GroupStyle.HeaderTemplate> 
        <DataTemplate> 
         <StackPanel> 
          <TextBlock Text="{Binding Path=Name}" /> 
         </StackPanel> 
        </DataTemplate> 
       </GroupStyle.HeaderTemplate> 
       <GroupStyle.ContainerStyle> 
        <Style TargetType="{x:Type GroupItem}"> 
         <Setter Property="Template"> 
          <Setter.Value> 
           <ControlTemplate TargetType="{x:Type GroupItem}"> 
            <Expander> 
             <Expander.Header> 
              <StackPanel Orientation="Horizontal"> 
               <TextBlock Text="{Binding Path=Name}" Margin="0,0,5,0"/> 
               <TextBlock Text="{Binding Path=ItemCount}"/> 
               <TextBlock Text=" Items"/> 
              </StackPanel> 
             </Expander.Header> 
             <ItemsPresenter /> 
            </Expander> 
           </ControlTemplate> 
          </Setter.Value> 
         </Setter> 
        </Style> 
       </GroupStyle.ContainerStyle> 
      </GroupStyle> 
     </DataGrid.GroupStyle> 
     <DataGrid.RowDetailsTemplate> 
      <DataTemplate> 
       <StackPanel Background="LightBlue" Orientation="Horizontal" > 
        <!-- <Image Height="32" Width="32" Source="/WpfUserControls;component/cat.png"></Image> --> 
        <TextBlock VerticalAlignment="Center" HorizontalAlignment="Center" Height ="20" Text="{Binding Path=Name}"/> 
       </StackPanel> 
      </DataTemplate> 
     </DataGrid.RowDetailsTemplate> 
    </DataGrid> 
    <StatusBar Grid.Row="2"></StatusBar> 

</Grid> 
</UserControl> 

Y aquí está la clase de contexto de datos y una clase de Kitten.

public class ADummyDataContext 
{ 
    public List<Kitten> Kittens { get; set; } 

    public ADummyDataContext() 
    { 
     Kittens = new List<Kitten> 
         { 
          new Kitten {Color = "Orange", Name = "Alfie", Weight=6, Sex="Male"}, 
          new Kitten {Color = "Black and White", Name = "Smudge", Weight = 4, Sex="Female"}, 
          new Kitten {Color = "Grey", Name = "Charlotte", Weight = 5, Sex="Female"} 
         }; 
     KittensView = new ListCollectionView(Kittens); 
     KittensView.GroupDescriptions.Add(new PropertyGroupDescription("Weight")); 
    } 

    public ListCollectionView KittensView { get; set; } 
} 

public class Kitten 
{ 
    public string Name { get; set; } 
    public string Color { get; set; } 
    public int Weight { get; set; } 
    public string Sex { get; set; } 

} 

Estaría particularmente interesado en saber cómo hacer para descubrir cuál es el problema aquí.

Gracias

+0

Esto probablemente no arreglar el problema, pero en el pasado he tenido problemas al usar Listas, tal vez intente cambiar la lista a un ObservableCollection? – Purplegoldfish

+0

También es un muy buen punto. Gracias :) – Ian

Respuesta

5

El problema es que el primer elemento de la DataGrid ya está seleccionado cuando se carga por primera vez. Sin embargo, no está realmente seleccionado, no aparece seleccionado y el grupo no está expandido. Pero cuando hace clic en el primer elemento por primera vez, el DataGrid no puede distinguir ya que SelectedIndex ya era 0. Esto es realmente molesto y noté un comportamiento similar varias veces antes.

Como solución, puede anular la selección del primer elemento de la Loaded caso de la DataGrid

<DataGrid Loaded="dataGrid1_Loaded" 
      ...> 

Controlador de eventos: Observe que el SelectedIndex es 0

private void dataGrid1_Loaded(object sender, RoutedEventArgs e) 
{ 
    DataGrid dataGrid = sender as DataGrid; 
    dataGrid.SelectedItem = null; 
} 
+0

Esto lo arregla para mí. Extraño: no esperaba, porque si clasifiqué KittensView de manera diferente, vi el mismo problema con "Alfie" ¡aunque era el último en la grilla! –

+0

Curioso. Parece extraño que solo se "dibuje" o se evalúe en un evento de cambio. Quiero decir que no, es exactamente lo que esperaría si esto estuviera de regreso en la tierra de las formas de ganar, pero esperaba más magia :) Gracias Meleak, bonificación feliz para el fin de semana :) – Ian

+0

@Ian: Feliz de ayudar :) Y Estoy de acuerdo, esto no es lo que uno esperaría ... –

0

gracias much @ Fredrik aquí está el código que sigue mi comentario:

XAML:

<DataGrid SelectionChanged="DataGrid_SelectionChanged"> 

codebehind.cs:

private void DataGrid_SelectionChanged(object sender, SelectionChangedEventArgs e) 
{ 
    DataGrid dataGrid = sender as DataGrid; 
    dataGrid.SelectionChanged -= DataGrid_SelectionChanged; 
    dataGrid.SelectedItem = null; 
    dataGrid.SelectionChanged += DataGrid_SelectionChanged; 
} 

este código también permite actualizar los datos tanto como usted quiere