Silverlight:DataGrid.SelectedIndex 总是得到 -1
Silverlight: DataGrid.SelectedIndex always getting -1
我的项目中有这个 DataGrid:
<sdk:DataGrid RowDetailsVisibilityChanged="dataGrid1_RowDetailsVisibilityChanged" Grid.Row="1" Loaded="dataGrid1_Loaded" ItemsSource="{Binding ElementName=getVarede_ResultDomainDataSource,
Path=Data}" RowDetailsVisibilityMode="Collapsed" AutoGenerateColumns="False" Style="{StaticResource DataGridStyle}" Height="Auto" IsReadOnly="True"
HorizontalAlignment="Left" Name="dataGrid1" VerticalAlignment="Top" SelectionChanged="dataGrid1_SelectionChanged"
MouseEnter="dataGrid1_MouseEnter" MouseLeave="dataGrid1_MouseLeave" GotFocus="dataGrid1_GotFocus" LoadingRow="dataGrid1_LoadingRow"
KeyDown="dataGrid1_KeyDown" KeyUp="dataGrid1_KeyUp" LoadingRowDetails="dataGrid1_LoadingRowDetails" Cursor="Hand" Background="#FFCADCE8" >
//....
</sdk:DataGrid>
我将选定的行值保存在类似会话的内容中:
private void dataGrid1_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
Application.Current.Host.InitParams["CurrentRow"] = dataGrid1.SelectedIndex.ToString();
//...
}
所以当 DataGrid 加载时我想将存储值设置为 SeletedIndex:
dataGrid1.SelectedIndex = int.Parse(Application.Current.Host.InitParams["CurrentRow"]);
但它总是得到 -1 并且第一行被选中。
有什么想法吗?
您无法使用您发布的方法在会话之间保存 Init 参数。
这里 an article 描述了如何读取初始化参数并将它们存储在隔离存储中。
它们不应像您在此处所做的那样由您的代码设置:
Application.Current.Host.InitParams["CurrentRow"] = dataGrid1.SelectedIndex.ToString();
[编辑]
好的,在我阅读了您的最新评论之后...我明白了您的实际问题是什么。您设置 SelectedIndex
的方式太早了。当您在 Loaded
事件处理程序中设置它时,项目不存在。所以你可以将索引设置为任何你想要的,只要你在控件中没有任何项目,它总是回落到-1。您必须等到项目加载完毕,然后才设置选定的索引。
前面的伪代码:
...
INotifyCollectionChanged items = dataGrid.Items;
items.CollectionChanged += OnItemsChanged;
...
private void OnItemsChanged()
{
dataGrid.SelectedIndex = 42;
}
我的项目中有这个 DataGrid:
<sdk:DataGrid RowDetailsVisibilityChanged="dataGrid1_RowDetailsVisibilityChanged" Grid.Row="1" Loaded="dataGrid1_Loaded" ItemsSource="{Binding ElementName=getVarede_ResultDomainDataSource,
Path=Data}" RowDetailsVisibilityMode="Collapsed" AutoGenerateColumns="False" Style="{StaticResource DataGridStyle}" Height="Auto" IsReadOnly="True"
HorizontalAlignment="Left" Name="dataGrid1" VerticalAlignment="Top" SelectionChanged="dataGrid1_SelectionChanged"
MouseEnter="dataGrid1_MouseEnter" MouseLeave="dataGrid1_MouseLeave" GotFocus="dataGrid1_GotFocus" LoadingRow="dataGrid1_LoadingRow"
KeyDown="dataGrid1_KeyDown" KeyUp="dataGrid1_KeyUp" LoadingRowDetails="dataGrid1_LoadingRowDetails" Cursor="Hand" Background="#FFCADCE8" >
//....
</sdk:DataGrid>
我将选定的行值保存在类似会话的内容中:
private void dataGrid1_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
Application.Current.Host.InitParams["CurrentRow"] = dataGrid1.SelectedIndex.ToString();
//...
}
所以当 DataGrid 加载时我想将存储值设置为 SeletedIndex:
dataGrid1.SelectedIndex = int.Parse(Application.Current.Host.InitParams["CurrentRow"]);
但它总是得到 -1 并且第一行被选中。
有什么想法吗?
您无法使用您发布的方法在会话之间保存 Init 参数。 这里 an article 描述了如何读取初始化参数并将它们存储在隔离存储中。 它们不应像您在此处所做的那样由您的代码设置:
Application.Current.Host.InitParams["CurrentRow"] = dataGrid1.SelectedIndex.ToString();
[编辑]
好的,在我阅读了您的最新评论之后...我明白了您的实际问题是什么。您设置 SelectedIndex
的方式太早了。当您在 Loaded
事件处理程序中设置它时,项目不存在。所以你可以将索引设置为任何你想要的,只要你在控件中没有任何项目,它总是回落到-1。您必须等到项目加载完毕,然后才设置选定的索引。
前面的伪代码:
...
INotifyCollectionChanged items = dataGrid.Items;
items.CollectionChanged += OnItemsChanged;
...
private void OnItemsChanged()
{
dataGrid.SelectedIndex = 42;
}