4

有没有办法关闭 Silverlight 内置 DataGrid 中第一行的自动选择?

我们基于用户在数据网格中选择一行来构建许多功能。当数据绑定或排序时,SelectionChanged 的​​自动触发确实给我们带来了问题。我们试图在选择周围设置一些守卫,但似乎无法涵盖所有​​问题。

例如,如果在加载屏幕时未显示的 TabControl 选项卡中有 DataGrid,并且 DataGrid 绑定到作为对象列表的 DataContext 的属性。在显示选项卡之前,网格不会进行数据绑定。是否有事件告诉我们网格是数据绑定的?数据绑定的默认行为不应该是不选择行吗?

谢谢迈克

4

5 回答 5

3

您是否尝试过在用户控件的构造函数中设置一个布尔字段(例如 bool dataGridFirstLoad),该字段设置为 false。

然后在 DataGrid 的 SelectionChanged 事件上,检查 dataGridFirstLoad 是否为 false。如果 false 设置为 true 并将 SelectedItem 设置为 null。

希望这可以帮助。

于 2008-11-22T19:51:54.907 回答
1

麦克风,

我通过包装 windows 控件并捕获包装 windows 网格的选择更改事件解决了这个问题。

在您的控件中,连接控件的 Loaded 事件,并在加载时将布尔私有成员变量设置为 true。然后,当您捕获内部数据网格的选择更改事件时,如果您的控件已加载,则仅引发您自己的选择更改事件。完成后,您现在可以返回 OnApplyTemplate 子程序,将内部数据网格的选定索引设置为 -1,将选定项设置为空。由于索引和项目的设置将在您的控件完成加载之前发生,因此不会触发选择更改事件。我在选项卡式和非选项卡式环境中都试过这个,它似乎没有问题。现在来解决一个更难的问题,您可能已经注意到,当您对 windows 数据网格进行排序时(当它是绑定到 ItemsSource 的数据时),它总是选择显示数据的顶部项目。这当然会触发选择更改事件,并移动到以前未选择的项目,据我所知,不应选择。要处理这个问题,您将不得不做一些更棘手的编码。如果您注意到,当您捕获内部网格的选择更改事件并查看其所选项目时,只有少数情况下所选项目未设置为任何内容,即当不再选择项目时(即. 选择被清除),或者当(提示)列正在排序时。当你在排序时,有两个事件会触发,第一个是取消选择项目(SelectedItem is Nothing),第二个是选择列表中的顶部项目(SelectedIndex 0)。现在,如果您要在事件处理程序中为内部网格选择更改事件放置一个标志,并发现该项目什么都不是,您可以跟踪先前的选定项目,然后设置内部数据网格的选定项目到之前选择的项目。

这很好地解决了问题,并且在包装 Windows 控件时可能会出现不希望的结果,但据我所知,这似乎是解决在加载问题时选择第一行的唯一方法。然而,我只能想象,这将在某个时候由 M$ 解决。

我希望这有帮助,

谢谢,

斯科特

于 2008-11-19T07:14:44.513 回答
1

这与上面的帖子相似(并散列了 Paulo T 的建议)。这很好用。//在 xaml 或构造函数中设置 selectionchanged 处理程序 //我的页面上有 2 个网格,所以我为每个网格创建一个布尔属性

private bool IsFirstLoad { get; set; }
private bool IsFirstLoadDetails { get; set; }
public BookDisplay()
{
  //code here
  this.IsFirstLoad = true;
  this.IsFirstLoadDetails = true;
  BindBooks(); //define this function (not in this snippet for the sake of brevity)
}
private void GridBooks_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
  if (this.IsFirstLoad)
  {
    GridBooks.SelectedItem = -1;
    this.IsFirstLoad = false;
  }
  else
  {
    //do your stuff
  }
}
private void GridBooksWithDetails_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
  if (this.IsFirstLoadDetails)
  {
     GridBooksWithDetails.SelectedItem = -1;
     this.IsFirstLoadDetails = false;
  }
}
于 2009-02-13T16:27:52.153 回答
0

下面的代码应该做到这一点(每当您更新/刷新网格时将 JustRefreshed 设置为 true):

 int LastSelectedIndex = -1;
 bool JustRefreshed = false;

        private void dataGrid_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            if (JustRefreshed)
            {
                JustRefreshed = false;
                dataGrid.SelectedIndex = LastSelectedIndex;
                return;
            }
            if (e.AddedItems.Count > 0)
            {
                LastSelectedIndex = dataGrid.SelectedIndex;
                        }    
                //Your logic comes here...
            }
        }
于 2009-01-05T15:14:57.490 回答
0

由于 Microsoft 提供了 DataGrid 的代码,因此我们删除了选择,因此我们不必解决它。我相信这不再是 Silverlight 3.0 网格的问题。

于 2010-02-03T22:29:44.873 回答