我使用的是Wpf Toolkit DataGrid。每当我为其分配Itemssource时,它的第一个项目被选中并且其selectionChanged事件被调用。如何在默认情况下阻止它选择任何行?
答案 0 :(得分:38)
检查您是否设置了IsSynchronizedWithCurrentItem="True"
,并且要求将其设置为相似?
<DataGrid IsSynchronizedWithCurrentItem="True" ...
将此属性设置为true,第一项的选择是默认行为。
答案 1 :(得分:11)
有可能您的DataGrid绑定到具有CurrentItem属性的PagedCollectionView等集合。此属性在两个方向上与所选行自动同步。解决方案是将CurrentItem设置为null。你可以这样做:
PagedCollectionView pcv = new PagedCollectionView(collection);
pcv.MoveCurrentTo(null);
dataGrid.ItemsSource = pcv;
这在Silverlight中特别有用,它没有 DataGrid.IsSynchronizedWithCurrentItem 属性......
答案 2 :(得分:2)
HCL的回答是正确的,但对于像我这样的快速和松散的读者来说,事实证明这令人困惑,我最后花了一些时间来回顾一下调查其他事情,然后再回到这里仔细阅读。
<DataGrid IsSynchronizedWithCurrentItem="False" ...
我们是否感兴趣,而不是它的对手!
添加我自己的一些价值:
属性IsSynchronizedWithCurrentItem=True
表示网格CurrentItem
将与集合的当前项同步。设置IsSynchronizedWithCurrentItem=False
就是我们想要的。
对于Xceed的Datagrid用户(例如我在这种情况下),那将是SynchronizeCurrent=False
答案 3 :(得分:1)
我尝试了很多不同的东西,但对我有用的是捕获第一个选择事件和&#34;撤消&#34;它通过取消选择datagrid上的所有内容。
这里有使这项工作的代码,我希望它对其他人有益:)
/* Add this inside your window constructor */
this.myDataGrid.SelectionChanged += myDataGrid_SelectionChanged;
/* Add a private boolean variable for saving the suppression flag */
private bool _myDataGrid_suppressed_flag = false;
/* Add the selection changed event handler */
void myDataGrid_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
/* I check the sender type just in case */
if (sender is System.Windows.Controls.DataGrid)
{
System.Windows.Controls.DataGrid _dg = (System.Windows.Controls.DataGrid)sender;
/* If the current item is null, this is the initial selection event */
if (_dg.CurrentItem == null)
{
if (!_myDataGrid_suppressed_flag)
{
/* Set your suppressed flat */
_dgRateList_suppressed_flag = true;
/* Unselect all */
/* This will trigger another changed event where CurrentItem == null */
_dg.UnselectAll();
e.Handled = true;
return;
}
}
else
{
/* This is a legitimate selection changed due to user interaction */
}
}
}