Silverlight-DataGrid 控件-选择更改事件干扰排序

2024-03-24

我目前正在使用 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。


对我来说这看起来像是一个 Silverlight bug。我刚刚尝试过,我这边发生的事情是选择已更改当您单击列标题时,事件会触发两次,更糟糕的是,所选项目的索引不会与当前所选项目保持同步。

我建议您通过使用第一次 SelectionChanged 触发的知识来解决这个问题,数据网格的值选定的项目财产将是null

这是一些至少可以解决该问题的示例代码。你的选择已更改逻辑可以进入if clause.

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; }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Silverlight-DataGrid 控件-选择更改事件干扰排序 的相关文章

随机推荐

  • 窗口背景图像的模糊效果

    我有一个以图像为背景的窗口 在那个窗口上我还有按钮和其他控件 这是我对该窗口的风格
  • Angular:使用指令禁用材质按钮不起作用

    我想通过指令禁用一些按钮 向按钮添加禁用属性 该指令适用于经典 html 按钮 但不适用于角形材质设计按钮 mat button https material angular io components button overview im
  • float64 到 float32 的转换给出了意外的结果

    当我转换一个float64数到一个float32我得到一个奇怪的结果 In 22 np float32 20140131 0 Out 22 20140132 0 为什么会发生这种情况 20140131 0 无法表示为 32 位整数 32位浮
  • 如何为 Azure 虚拟机生成磁盘不足警报

    我有一个虚拟机 用作构建服务器 该虚拟机的磁盘经常堆积 并且正在努力解决该问题 同时我正在寻找设置在磁盘空间变高时触发警报的选项 我检查了监控下的可用指标 但只能找到 磁盘写入字节 和 磁盘读取字节 这对我没有帮助 我需要帮助设置发送到我的
  • 通过R中的卷积添加两个随机变量

    我想计算 R 中两个概率分布的卷积 我需要一些帮助 为了简单起见 假设我有一个变量 x 它呈正态分布 平均值 1 0 stdev 0 5 变量 y 呈对数正态分布 平均值 1 5 stdev 0 75 我想确定 z x y 据我所知 z 的
  • .prop() 与 .data()

    随着新版本的发布jQuery v1 6 http api jquery com category version 1 6 并添加了 prop method 使用上是否存在本质区别 prop over data 我在文档中看到 在 IE9 之
  • Spring MVC:发布请求和带有数组的 json 对象:错误的请求

    我正在尝试使用 Spring MVC 从 http POST 请求中检索参数 该请求包含以下 json 对象 内容类型 application json 该对象本身包含一个 customObjects 数组 globalId 338 lin
  • 有角。为什么调用markForCheck()结果来查看更新

    到处都说 markForCheck 只是将当前组件视图和所有父组件 直到根组件 标记为脏组件 因此 下次 DetectChanges 执行时 它将更新视图 从这一点上我有两个问题 两者都在该组件具有的上下文中changeDetection
  • 在php中,“return false”在echo语句之后会执行任何操作吗?

    当我在 php 中显示错误消息时 我通常这样做 if query Success code else Error message error msg An error occurred return false 我回应 error msg前
  • Bokeh:AttributeError:“DataFrame”对象没有属性“tolist”

    我是 pandas 和 bokeh 的新手 我正在尝试从 pandas 数据帧创建散点图 但是 我不断收到以下错误 new data colname df colname tolist AttributeError DataFrame ob
  • 发现扩展时遇到错误:Error Domain=PlugInKit Code=13“查询已取消”

    我正在尝试显示或上传 UIImage 但收到此错误 发现扩展时遇到错误 Error Domain PlugInKit Code 13 查询已取消 UserInfo NSLocalizedDescription 查询已取消 import UI
  • 宏中的 SAS 宏

    我有一个关于 macro 的问题 我可以在另一个 宏中设置 宏吗 简短的例子 情况的 图片 macro Tier 1 do Iter 1 to i macro Tier 2 proc sql noprint select 1 Iter in
  • SOAP 请求返回 wsdl 而不是预期的 SOAP 响应

    我的 SOAP 请求有问题 当我尝试向服务器发送以下肥皂请求时 它会返回 预期结果 地点 https YOUR SERVER apitransactional services TransactionalService wsdl Input
  • Ruby 相当于 grep -v

    这就是我一直在做的事情 my array reject elem elem regex each 我觉得这有点笨拙 但我还没有找到任何内置的东西可以让我将其更改为my array grepv regex 有这样的功能吗 Ruby 2 3 实
  • 如何使用DATA_PUMP导出到S3存储桶?

    我们有 RDS Oracle 实例 我需要将特定架构导出到转储文件中 导出工作并将转储文件复制到 DATA PUMP DIR 问题是 RDS 没有文件目录访问权限 我需要在 S3 上导出 DMP 文件或复制到另一个 EC2 实例 文章 LI
  • 轻松的十六进制/浮点转换

    我正在 c 和 python 程序之间进行一些输入 输出 仅浮点值 python 有一个很好的功能 可以将浮点值转换为十六进制数字并返回 如您在此链接中看到的 http docs python org library stdtypes ht
  • annotationProcessor gradle 4.7+ 配置不运行 lombok

    我在使用 gradle 4 7 项目时收到以下消息 The following annotation processors were detected on the compile classpath lombok launch Annot
  • IHTTPHandler 的无缓冲输出

    我想从一个流式传输数据IHttpHandler班级 我从数据库加载大量行 序列化并压缩它们 然后通过网络发送它们 另一方面 我希望我的客户端能够在服务器完成所有对象的序列化之前解压缩和反序列化数据 我在用着context Response
  • Angular 2 路由引发 404 错误

    HTML5 推送状态意味着刷新 URL 或在浏览器中输入直接 URL 当我使用以下命令运行我的 Angular 应用程序时效果非常好 npm start 来自 VS 2015 命令提示符的命令 但是 当我在 IIS 上部署相同的应用程序并更
  • Silverlight-DataGrid 控件-选择更改事件干扰排序

    我目前正在使用 Silverlight Beta 2 Datagrid 控件 在连接 SelectionChanged 事件之前 网格将通过单击标题完美排序 现在 当单击网格时 当我单击标题进行排序时 它将触发 SelectionChang