我目前正在使用Silverlight(Beta 2)Datagrid控件。 在连接SelectionChanged事件之前,通过单击标题可以对网格进行完美排序。 现在,当单击网格时,当我单击标题进行排序时,它将触发SelectionChanged事件。 有没有办法解决?

在一个半相关的主题中,我想在单击一个已选择的项目时触发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。

===============>>#1 票数:4 已采纳

在我看来,这似乎是Silverlight的错误。 我刚刚尝试过,最后发生的是,当您单击列标题时, SelectionChanged事件将触发两次,更糟糕的是,所选项目的索引不会与当前所选项目保持同步。

我建议您使用以下知识来解决该问题,即首次触发SelectionChanged时,datagrid的SelectedItem属性的值将为null

这是至少与该问题有关的一些示例代码。 您的SelectionChanged逻辑可以放在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; }
}

===============>>#2 票数:1

Silverlight DataGrid中的冻结列

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

===============>>#3 票数:1

您提到的第一个问题有一个错误修正(选择更改事件在度假村触发)。

请参阅以下URL以获取Microsoft的补丁程序:

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

===============>>#4 票数:0

这可行,但是现在如果我进行两次排序,则在第一个列表上进行排序,然后将弹出窗口作为网格的第一个选定项。 如果我关闭弹出网格,然后尝试第二次排序,则堆栈会溢出,并导致Firefox崩溃。

我想我可能需要重新考虑在Silverlight中工作,直到系统变得更稳定为止。

感谢您的答案霍维托!

  ask by Rob translate from so

未解决问题?本站智能推荐:

3回复

Silverlight DataGrid控件 - 如何停止对列的排序?

从昨天开始继续我的问题,我从这个问题中得到的Silverlight数据网格现在在用大量数据排序列时导致Stack Overflow错误(就像包含SQL语句的where子句的文本列一样)。 排序时,它将触发datagrid的SelectedIndexChanged事件,然后仍尝试stort。
2回复

WPF / Silverlight-在DataGrid上选择的行样式

在Silverlight中,而不是在选定的行和活动单元格中,对DataGrid进行逐行选择的最佳方法是什么? 对于我当前的应用程序,我只是不需要活动单元格的UI效果。
1回复

silverlight datagrid:绑定到对象的排序列

我有绑定到ObservableCollection的数据网格。 列之一绑定到对象本身,而不是属性: 我想使绑定到对象本身的列可排序。 我认为让类Person实现IComparable就足够了。 但这似乎还不够:
3回复

在MVVM中对Silverlight DataGrid进行预排序

我将DataGrid到ObservableCollection我在计时器上更新了集合,并且网格更新很好,这正是我想要的。 但是,即使我可以按初始人口对收集进行排序-当我添加新项目时,它们也会降到最低。 用户可以对网格进行排序,然后看起来不错。 我想“强制”网格在初始化时按特定列排序
1回复

自定义排序比较器 Silverlight Datagrid

我有一个Silverlight Toolkit数据网格,其中一列显示了数值的文本表示形式。 我想对列的基础数字值进行排序,但将文本数据呈现给用户。 网格列中的值采用以下格式: 类别(200-300) 某些类别(100-200) 又一类(300-400) 由于
1回复

如何更改Silverlight Datagrid中数据的FontSize

我试图弄清楚如何使我的Datagrid中的数据的字体大小更大。 我的Datagrid XAML: 使用样式我可以放大标题字体大小。 我是否需要执行类似的操作来更改实际数据的字体大小?
2回复

关于Silverlight sdk和子输入,C#中的DataGrid控件的问题

我正在使用DataGrid控件编写Silverlight 5 Web应用程序。 我确实有一个有趣的问题。 我为每一行使用模板列。 每一行代表一个可观察集合中的一个数据项。 每行包含一个复选框,一个文本块和一个文本框。 我的错误发生的环境是一种行数多于Silverlight可
2回复

在Silverlight应用程序中使用空格键选择Datagrid行

我在Silverlight应用程序中有一个Datagrid。 用户可以使用Tab键将注意力集中在Datagrid上,并使用向上和向下箭头键在各行之间移动。 请提出建议,当用户按下选定行的空格键时,如何触发行选择事件。 下面是代码片段:
1回复

Datagrid列定义silverlight问题

在xaml中: 错误1“DataGridTextColumn”类型不支持direct 我想在datagrid的datagridview的列的每一行中添加一个按钮 看:
1回复

选择后使文本在Silverlight数据网格单元中加粗

我正在尝试使用XAML在Silverlight 4中使选定单元格的文本加粗。 我曾尝试修改DataGridCell模板,但我所做的只是修改所选的背景颜色,而找不到字体粗细的任何东西。