有没有办法在Silverlight中关闭内置DataGrid中第一行的自动选择?
我们根据用户在数据网格中选择一行来构建许多功能。在数据绑定或排序时自动触发SelectionChanged确实导致了我们的问题。我们试图在选择中加入一些保护措施,但似乎无法解决所有问题。
例如,如果在加载屏幕时未显示TabControl的选项卡中有DataGrid,并且DataGrid具有与作为对象列表的DataContext的属性的绑定。在显示选项卡之前,网格不是数据绑定的。是否有事件告诉我们网格是数据绑定?数据绑定的默认行为不应该是选择一行吗?
由于 麦克
答案 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网格的问题。