Pregunta

Actualmente estoy jugando con el control Datagrid de Silverlight (Beta 2).Antes de conectar el evento SelectionChanged, la cuadrícula se ordenaba perfectamente al hacer clic en el encabezado.Ahora, cuando se hace clic en la cuadrícula, se activará el evento SelectionChanged cuando haga clic en el encabezado para ordenar.¿Hay alguna manera de evitar esto?

En un tema semi-relacionado, me gustaría que se active el evento SelectionChanged cuando hago clic en un elemento ya seleccionado (para que pueda aparecer una ventana emergente que permita al usuario editar el valor seleccionado).En este momento, debe hacer clic en un valor diferente y luego volver al valor que deseaba para que aparezca.¿Hay otra manera?

Incluido está mi código.

La página:

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

Y la llamada que ocurre cuando se cambia la selección de la grilla:

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

Lo siento si mi código es atroz, todavía estoy aprendiendo Silverlight.

¿Fue útil?

Solución

Eso me parece un error de Silverlight.Lo acabo de probar y lo que sucede por mi parte es que el SelecciónCambiada El evento se activa dos veces al hacer clic en el encabezado de la columna y, para empeorar las cosas, el índice del elemento seleccionado no permanece sincronizado con el elemento seleccionado actualmente.

Le sugiero que lo solucione sabiendo que la primera vez que se activa SelectionChanged, el valor de la cuadrícula de datos Item seleccionado la propiedad será nulo

Aquí hay un código de muestra que al menos soluciona el problema.Su SelecciónCambiada la lógica puede ir en el si cláusula.

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

Otros consejos

Hay una corrección de errores para el primer problema que mencionaste (el evento de cambio de selección fue activado en el resort).

Consulte la siguiente URL para ver el parche de Microsoft:

http://www.microsoft.com/downloads/details.aspx?familyid=084A1BB2-0078-4009-94EE-E659C6409DB0&displaylang=en

Esto funcionó, pero ahora, si ordeno dos veces, en la primera se ordena y luego aparece la ventana emergente como el primer elemento seleccionado de la cuadrícula.Si cierro la cuadrícula emergente y luego intento ordenarla por segunda vez, la pila se desborda y bloquea Firefox.

Creo que quizás deba reconsiderar el trabajo en Silverlight hasta que el sistema se vuelva un poco más estable.

¡Gracias por la respuesta Hovito!

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top