2008-09-16 8 views
2

В настоящее время я играю с элементом управления Silverlight (Beta 2) Datagrid. Прежде чем я подключил событие SelectionChanged, сетка будет сортироваться отлично, нажав на заголовок. Теперь, когда нажата сетка, она будет запускать событие SelectionChanged, когда я нажимаю заголовок для сортировки. Есть ли способ обойти это?Silverlight-DataGrid control - Выбор Измененное событие, мешающее сортировке

В теме, относящейся к полу, я хотел бы иметь огонь события SelectionChanged, когда я нажимаю на уже выбранный элемент (чтобы у меня было всплывающее окно, позволяющее пользователю отредактировать выбранное значение) , Прямо сейчас вам нужно щелкнуть другое значение, а затем вернуться к требуемому значению, чтобы оно появилось. Есть ли другой способ?

Входит в мой код.

страницу:

<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> 

И вызов, который происходит, когда выбор сетке был изменен:

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 

Извините, если мой код отвратительная, я все еще учусь Silverlight ,

ответ

4

Это похоже на ошибку Silverlight. Я только что попробовал, и что происходит на моем конце, так это событие SelectionChanged срабатывает дважды, когда вы нажимаете заголовок столбца, а ухудшаете ситуацию, индекс выбранного элемента не остается синхронизированным с выбранным в данный момент элементом.

я предлагаю вам работать ваш путь вокруг него, используя знания о том, что первый раз SelectionChanged пожары, значение SelectedItem имущества DataGrid будет нулевой

Вот некоторые примеры кода, по крайней мере, живет с проблемой. Ваш SelectionChanged логика может идти в , если статья.

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

Это сработало, но теперь, если я сортирую дважды, на первом, который он сортирует, а затем всплывает как первый выбранный элемент сетки. Если я закрою всплывающую сетку, а затем попытаюсь выполнить сортировку во второй раз, она переполнит стек и выйдет из строя firefox.

Я думаю, что мне может потребоваться пересмотреть работу в silverlight, пока система не станет немного более стабильной.

Спасибо за ответ Hovito!