В общем стоит задача, есть датагрид, из вне у него устанавливается SelectedIndex и нужно что-бы сразу происходил автоскролл до выделенного объекта (ну и как дополнение чтобы было видно еще следующие 5 объектов). Вся проблема в том что скрол не доходит до элемента, который находится далеко внизу списка, который сейчас не видно, например если я сейчас вижу элементы с 40-80, то до 120 он не скролится автоматом, но зато до 20 скроллится.
Вот код Behavior который я дописал к датагриду
public class ScrollIntoViewBehavior : Behavior<DataGrid>
{
protected override void OnAttached()
{
AssociatedObject.SelectionChanged += new SelectionChangedEventHandler(AssociatedObject_SelectionChanged);
}
void AssociatedObject_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
var dataGrid = (sender as DataGrid);
dataGrid.UpdateLayout();
dataGrid.ScrollIntoView(dataGrid.SelectedItem);
}
}
Xaml внутри тега DataGrid
<i:Interaction.Behaviors>
<behaviors:ScrollIntoViewBehavior />
</i:Interaction.Behaviors>
И код установления индекса
public void SetFocusOnCommandByNumber(int index)
{
if ((index >= _commands.Count) || (SelectedIndex == index))
return;
if ((index + 5) < _commands.Count)
{
SelectedIndex = index + 5;
SelectedIndex = index;
}
else
{
SelectedIndex = index;
}
}
Индекс приходит из вне несколько раз в секунду, поэтому я исключил сигналы об изменении если значение не изменилось.