2008-09-16 33 views
2

Je joue actuellement avec le contrôle Datagrid Silverlight (Beta 2). Avant de câbler l'événement SelectionChanged, la grille était parfaitement triée en cliquant sur l'en-tête. Maintenant, lorsque la grille est cliquée, il déclenche l'événement SelectionChanged lorsque je clique sur l'en-tête pour trier. Y at-il un moyen de contourner cela? Dans un sujet semi-connexe, j'aimerais que l'événement SelectionChanged se déclenche lorsque je clique sur un élément déjà sélectionné (afin que je puisse avoir une fenêtre pop-up permettant à l'utilisateur de modifier la valeur sélectionnée) . En ce moment, vous devez cliquer sur une valeur différente, puis revenir à la valeur que vous vouliez pour qu'elle apparaisse. Y a-t-il un autre moyen?Contrôle Silverlight-DataGrid - Sélection Événement modifié interférant avec le tri

Inclus est mon code.

Le Page:

<UserControl x:Class="WebServicesApp.Page" 
xmlns="http://schemas.microsoft.com/client/2007" 
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
xmlns:data="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Data" 
Width="1280" Height="1024" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" mc:Ignorable="d"> 
<Grid x:Name="LayoutRoot" Background="White"> 
    <Grid.RowDefinitions> 
     <RowDefinition /> 
     <RowDefinition /> 
    </Grid.RowDefinitions> 
    <StackPanel Grid.Row="0" x:Name="OurStack" Orientation="Vertical" Margin="5,5,5,5"> 
     <ContentControl VerticalAlignment="Center" HorizontalAlignment="Center"> 
      <StackPanel x:Name="SearchStackPanel" Orientation="Horizontal" Margin="5,5,5,5"> 
       <TextBlock x:Name="SearchEmail" HorizontalAlignment="Stretch" VerticalAlignment="Center" Text="Email Address:" Margin="5,5,5,5" /> 
       <TextBox x:Name="InputText" HorizontalAlignment="Stretch" VerticalAlignment="Center" Width="150" Height="Auto" Margin="5,5,5,5"/> 
       <Button x:Name="SearchButton" Content="Search" Click="CallServiceButton_Click" HorizontalAlignment="Center" VerticalAlignment="Center" Width="75" Height="Auto" Background="#FFAFAFAF" Margin="5,5,5,5"/> 
      </StackPanel>    
     </ContentControl> 
<Grid x:Name="DisplayRoot" Background="White" ShowGridLines="True" 
       HorizontalAlignment="Center" VerticalAlignment="Center" MaxHeight="300" MinHeight="100" MaxWidth="800" MinWidth="200" 
       ScrollViewer.HorizontalScrollBarVisibility="Visible" ScrollViewer.VerticalScrollBarVisibility="Visible"> 
<data:DataGrid ItemsSource="{Binding ''}" CanUserReorderColumns="False" CanUserResizeColumns="False" 
          AutoGenerateColumns="False" AlternatingRowBackground="#FFAFAFAF" SelectionMode="Single" 
          HorizontalAlignment="Center" VerticalAlignment="Center" Margin="5,5,5,5" x:Name="IncidentGrid" SelectionChanged="IncidentGrid_SelectionChanged"> 
       <data:DataGrid.Columns> 
        <data:DataGridTextColumn DisplayMemberBinding="{Binding Address}" Header="Email Address" IsReadOnly="True" /> <!--Width="150"--> 
        <data:DataGridTextColumn DisplayMemberBinding="{Binding whereClause}" Header="Where Clause" IsReadOnly="True" /> <!--Width="500"--> 
        <data:DataGridTextColumn DisplayMemberBinding="{Binding Enabled}" Header="Enabled" IsReadOnly="True" /> 
</data:DataGrid.Columns> 
      </data:DataGrid> 
     </Grid> 
    </StackPanel> 
    <Grid x:Name="EditPersonPopupGrid" Visibility="Collapsed"> 
     <Rectangle HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Opacity="0.765" Fill="#FF8A8A8A" /> 
     <Border CornerRadius="30" Background="#FF2D1DCC" Width="700" Height="400" HorizontalAlignment="Center" VerticalAlignment="Center" BorderThickness="1,1,1,1" BorderBrush="#FF000000"> 
      <StackPanel x:Name="EditPersonStackPanel" Orientation="Vertical" Background="White" HorizontalAlignment="Center" VerticalAlignment="Center" Width="650" > 
       <ContentControl> 
        <StackPanel x:Name="EmailEditStackPanel" Orientation="Horizontal"> 
         <TextBlock Text="Email Address:" Width="200" Margin="5,0,5,0" /> 
         <TextBox x:Name="EmailPopupTextBox" Width="200" /> 
        </StackPanel> 
       </ContentControl> 
       <ContentControl> 
        <StackPanel x:Name="AppliesToDropdownStackPanel" Orientation="Horizontal" Margin="2,2,2,0"> 
         <TextBlock Text="Don't send when update was done by:" /> 
         <StackPanel Orientation="Vertical" MaxHeight="275" MaxWidth="350" > 
          <TextBlock x:Name="SelectedItemTextBlock" TextAlignment="Right" Width="200" Margin="5,0,5,0" /> 
          <Grid x:Name="UserDropDownGrid" MaxHeight="75" MaxWidth="200" Visibility="Collapsed" ScrollViewer.VerticalScrollBarVisibility="Visible" ScrollViewer.HorizontalScrollBarVisibility="Hidden" > 
           <Rectangle Fill="White" /> 
           <Border Background="White"> 
            <ListBox x:Name="UsersListBox" SelectionChanged="UsersListBox_SelectionChanged" ItemsSource="{Binding UserID}" /> 
           </Border>          
          </Grid> 
         </StackPanel> 
         <Button x:Name="DropDownButton" Click="DropDownButton_Click" VerticalAlignment="Top" Width="25" Height="25"> 
          <Path Height="10" Width="10" Fill="#FF000000" Stretch="Fill" Stroke="#FF000000" Data="M514.66669,354 L542.16669,354 L527.74988,368.41684 z" HorizontalAlignment="Center" VerticalAlignment="Center" Margin="1,1,1,1"/> 
         </Button> 
        </StackPanel> 
       </ContentControl> 
       <TextBlock Text="Where Clause Condition:" /> 
       <TextBox x:Name="WhereClauseTextBox" Height="200" Width="800" AcceptsReturn="True" TextWrapping="Wrap" /> 
       <ContentControl> 
        <StackPanel Orientation="Vertical"> 
         <StackPanel Orientation="Horizontal"> 
          <Button x:Name="TestConditionButton" Content="Test Condition" Margin="5,5,5,5" Click="TestConditionButton_Click" /> 
          <Button x:Name="Save" Content="Save" HorizontalAlignment="Right" Margin="5,5,5,5" Click="Save_Click" /> 
          <Button x:Name="Cancel" Content="Cancel" HorizontalAlignment="Right" Margin="5,5,5,5" Click="Cancel_Click" />      
         </StackPanel> 
         <TextBlock x:Name="TestContitionResults" Visibility="Collapsed" /> 
        </StackPanel> 
       </ContentControl> 
      </StackPanel>    
     </Border>    
    </Grid>  
</Grid> 

Et l'appel qui se produit lorsque l'on change la sélection de la grille:

Private Sub IncidentGrid_SelectionChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) 

    If mFirstTime Then 
     mFirstTime = False 
    Else 
     Dim data As SimpleASMX.EMailMonitor = CType(IncidentGrid.SelectedItem, SimpleASMX.EMailMonitor) 
     Dim selectedGridItem As SimpleASMX.EMailMonitor = Nothing 
     If IncidentGrid.SelectedItem IsNot Nothing Then 
      selectedGridItem = CType(IncidentGrid.SelectedItem, SimpleASMX.EMailMonitor) 
      EmailPopupTextBox.Text = selectedGridItem.Address 
      SelectedItemTextBlock.Text = selectedGridItem.AppliesToUserID 
      WhereClauseTextBox.Text = selectedGridItem.whereClause 
      IncidentGrid.SelectedIndex = mEmailMonitorData.IndexOf(selectedGridItem) 
     End If 
     If IncidentGrid.SelectedIndex > -1 Then 
      EditPersonPopupGrid.Visibility = Windows.Visibility.Visible 
     Else 
      EditPersonPopupGrid.Visibility = Windows.Visibility.Collapsed 
     End If 
    End If 
End Sub 

Désolé si mon code est atroce, je suis encore à apprendre Silverlight .

Répondre

4

Cela ressemble à un bug Silverlight pour moi. Je viens de l'essayer et ce qui se passe de mon côté est que l'événement SelectionChanged se déclenche deux fois lorsque vous cliquez sur l'en-tête de la colonne et que l'index de l'élément sélectionné ne reste pas synchronisé avec l'élément sélectionné.

Je vous suggère de travailler votre chemin en utilisant les connaissances que la première fois SelectionChanged incendies, la valeur de SelectedItem propriété sera null

de DataGrid Voici quelques exemples de code au moins vit avec le problème. Votre logique SelectionChanged peut aller dans la clause si.

public partial class Page : UserControl 
{ 
    private Person _currentSelectedPerson; 

    public Page() 
    { 
     InitializeComponent(); 

     List<Person> persons = new List<Person>(); 
     persons.Add(new Person() { Age = 5, Name = "Tom" }); 
     persons.Add(new Person() { Age = 3, Name = "Lisa" }); 
     persons.Add(new Person() { Age = 4, Name = "Sam" }); 

     dg.ItemsSource = persons; 
    }  

    private void SelectionChanged(object sender, EventArgs e) 
    { 
     DataGrid grid = sender as DataGrid; 
     if (grid.SelectedItem != null) 
     { 
      _currentSelectedPerson = grid.SelectedItem as Person; 
     } 
     else 
     { 
      grid.SelectedItem = _currentSelectedPerson; 
     } 
    } 
} 

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

Cela a fonctionné, mais maintenant si je trie deux fois, sur le premier trie, et fait alors la fenêtre contextuelle comme le premier élément sélectionné de la grille. Si je ferme la grille contextuelle, puis que j'essaie de trier une seconde fois, la pile déborde et se bloque sur Firefox.

Je pense que je devrais peut-être repenser le travail dans silverlight jusqu'à ce que le système devienne un peu plus stable.

Merci pour la réponse Hovito!