我正在尝试实现一种行为,使我的
我找到了这个解决方案(https://www.codeproject.com/Tips/125583/ScrollIntoView-for-a-DataGrid-when-using-MVVM),它确实将新添加的行带入了
这是我的
DataGrid
能够移动到底部新添加的行。我有按钮可以从ItemsSource
中添加/删除项目,并在添加新行时以编程方式设置SelectedCensusReportMapping
。我找到了这个解决方案(https://www.codeproject.com/Tips/125583/ScrollIntoView-for-a-DataGrid-when-using-MVVM),它确实将新添加的行带入了
DataGrid
的视图中。但问题是,当我尝试滚动DataGrid
时,当前选定的行始终保持在视图中,我无法滚动到其他行,这会将选定的行推出屏幕外。这是我的
DataGrid
的实现: <DataGrid Name="DataGrid_CensusReportMapping"
ItemsSource="{Binding Model.CensusReportMappings, UpdateSourceTrigger=PropertyChanged}"
SelectedItem="{Binding SelectedCensusReportMapping, UpdateSourceTrigger=PropertyChanged}"
AutoGenerateColumns="False"
CanUserAddRows="False"
CanUserDeleteRows="False">
<i:Interaction.Behaviors>
<h:ScrollIntoDataGridBehavior />
</i:Interaction.Behaviors>
</DataGrid>
如果我通过调试逐步执行代码,我发现每当滚动DataGrid
时,行为都会触发。为什么只是通过滚动DataGrid
就会触发行为?无论何时滚动,都会发生这种情况,无论选定的项目是否仍然保持在屏幕上或被推出屏幕。
以下是行为代码:
public class ScrollIntoDataGridBehavior : Behavior<DataGrid>
{
/// <summary>
/// Override of OnAttached() method to add SelectionChanged event handler
/// </summary>
protected override void OnAttached()
{
base.OnAttached();
this.AssociatedObject.SelectionChanged += new SelectionChangedEventHandler(AssociatedObject_SelectionChanged);
}
/// <summary>
/// Override of OnDetaching() method to add SelectionChanged event handler
/// </summary>
protected override void OnDetaching()
{
base.OnDetaching();
this.AssociatedObject.SelectionChanged -=
new SelectionChangedEventHandler(AssociatedObject_SelectionChanged);
}
/// <summary>
/// When the selection is changed, re-focus on new selection using the ScrollIntoView method
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
void AssociatedObject_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
if (sender is DataGrid)
{
DataGrid grid = (sender as DataGrid);
if (grid.SelectedItem != null)
{
Action action = delegate()
{
grid.UpdateLayout();
if (grid.SelectedItem != null)
{
grid.ScrollIntoView(grid.SelectedItem, null);
}
};
grid.Dispatcher.BeginInvoke(action);
}
}
}
}