Silverlight DataGrid在排序ItemSsource / DataContext时自动选择,排序,

时间:2008-11-18 15:38:42

标签: datagrid silverlight-2.0

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

我们根据用户在数据网格中选择一行来构建许多功能。在数据绑定或排序时自动触发SelectionChanged确实导致了我们的问题。我们试图在选择中加入一些保护措施,但似乎无法解决所有问题。

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

由于 麦克

5 个答案:

答案 0 :(得分:3)

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

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

希望这有帮助。

答案 1 :(得分:1)

迈克,

我通过包装Windows控件并捕获包装的Windows网格的选择更改事件来解决此问题。

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

这很好地解决了这个问题,并且一如往常在包装Windows控件时可能会出现意外结果,但据我所知,这似乎是绕过第一行选择加载问题的唯一方法。但是,我只能想象,M $会在某个时候修正。

我希望这有帮助,

谢谢,

斯科特

答案 2 :(得分: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;
  }
}

答案 3 :(得分: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...
            }
        }

答案 4 :(得分:0)

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

相关问题