有没有一种方法可以获取用户看到的第一个可见项?
在WinForms的DatagridView
中,我们有FirstDisplayedScrollingRowIndex
。WPF的变体有等效物吗?
我在ViewModel中使用了一个CollectionView,它绑定到XAML中的DataGrid。
仅为清楚起见:我不想获取选定行的索引,因为我已经能够这样做了...
示例
我的ObservableCollection中有20个项目,但由于大小限制,我的Datagrid只能显示13个项目。
之前,用户选择了Item2,然后向下滚动了一点,所以Item5-17可见。
我怎样才能获得Item5的索引?
XAML
<Style x:Key="DatagridStyle" TargetType="DataGrid">
<Setter Property="AutoGenerateColumns" Value="False"/>
<Setter Property="Background" Value="{StaticResource ColorDatagridBackground}"/>
<Setter Property="IsReadOnly" Value="True"/>
<Setter Property="CanUserAddRows" Value="False"/>
<Setter Property="CanUserDeleteRows" Value="False"/>
<Setter Property="CanUserResizeColumns" Value="False"/>
<Setter Property="CanUserReorderColumns" Value="True"/>
<Setter Property="CanUserSortColumns" Value="True"/>
<Setter Property="ColumnHeaderHeight" Value="25"/>
<Setter Property="Margin" Value="0,5,0,5"/>
<Setter Property="ItemsSource" Value="{Binding ItemCollection}"/>
</Style>
<DataGrid DockPanel.Dock="Top"
Style="{StaticResource DatagridStyle}"
util:DataGridColumnsBehavior.BindableColumns="{Binding DatagridColumns, UpdateSourceTrigger=PropertyChanged}"
IsSynchronizedWithCurrentItem="True"
EnableRowVirtualization="True">
<i:Interaction.Behaviors>
<util:DataGridScrollBehaviour />
</i:Interaction.Behaviors>
</DataGrid>
ViewModel
private ObservableCollection<DataGridColumn> _datagridColumns;
private CollectionView _itemCollection;
private CollectionViewSource _itemCollectionSource;
public ObservableCollection<DataGridColumn> DatagridColumns
{
get => _datagridColumns;
set
{
_datagridColumns = value;
RaisePropertyChanged();
}
}
public CollectionView ItemCollection
{
get => _itemCollection;
set
{
_itemCollection = value;
RaisePropertyChanged();
}
}
public CollectionViewSource ItemCollectionSource
{
get => _itemCollectionSource;
set
{
_itemCollectionSource = value;
RaisePropertyChanged();
}
}
_datagridColumns = MainViewModel.GetColumns(MainViewModel.AppMode.Match);
_itemCollectionSource = new CollectionViewSource();
ItemCollectionSource.Source = _vml.Main.ItemList;
_itemCollection = (CollectionView)ItemCollectionSource.View;
期望的结果:
如果我的视图区域是...
- 在顶部,并且由于当前排序我在顶部添加一个项目,那么我希望我的视图区域仍然停留在顶部,这样我就可以看到我的新项目
- 在底部,并且由于当前排序我在底部添加一个项目,那么我希望我的视图区域移动到“新”的底部,这样我就可以看到我的新项目
- 位于任何中间位置,我希望继续查看相同数量的项目
我可以通过我的CollectionView访问SortOrder,但为了确定我的视图区域需要移动到哪里,我确实需要知道我的视图区域当前所在的位置(顶部、中间、底部)。
GridView
在ListView
或DataGrid
中?一些XAML会很有用。你想要可见元素的特定原因吗?总是可以使用触发器。 - XAMlMAX