visual tag data vb.net silverlight web-services xaml datagrid

vb.net - visual - Control Silverlight-DataGrid-Selección Evento modificado que interfiere con la clasificación



data grid visual basic (4)

Columnas congeladas en Silverlight DataGrid ...

http://dotnetdreamer.wordpress.com/2009/01/31/silverlight-2-datagrid-frozen-columns/

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

En un tema semi relacionado, me gustaría que el evento SelectionChanged se active 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 es 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.


Eso se parece a un error de Silverlight para mí. Acabo de probarlo y lo que está sucediendo en mi extremo es que el evento SelectionChanged se dispara 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 trabaje en su camino con el conocimiento de que la primera vez que se activa SelectionChanged, el valor de la propiedad SelectedItem de la cuadrícula de datos será nulo.

Aquí hay un código de muestra que al menos vive con el problema. Su lógica SelectionChanged puede ir en la cláusula if .

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


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

Estoy pensando que quizás deba replantearme el trabajo en Silverlight hasta que el sistema se vuelva un poco más estable.

Gracias por la respuesta Hovito!