I just ran into a small problem with a databound
DataGrid
in Silverlight. If the
SelectedItem
is changed by the
ViewModel
, the
DataGrid
does not scroll to the
SelectedItem
.
I created a behavior to do this for me. So now if the Selection of the
DataGrid
is changed, the
DataGrid
scolls to the
selecteditem
. (It used the
ScrollIntoView
method of the
DataGrid
.)
namespace MVVM.Framework
{public class ScrollIntoViewBehavior : Behavior<DataGrid>
{
protected override void OnAttached()
{
base.OnAttached();
this.AssociatedObject.SelectionChanged += new SelectionChangedEventHandler(AssociatedObject_SelectionChanged);
}
void AssociatedObject_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
if (sender is DataGrid)
{
DataGrid grid = (sender as DataGrid);
if (grid.SelectedItem != null)
{
grid.Dispatcher.BeginInvoke(delegate
{
grid.UpdateLayout();
grid.ScrollIntoView(grid.SelectedItem, null);
});
}
}
}
protected override void OnDetaching()
{
base.OnDetaching();
this.AssociatedObject.SelectionChanged -=
new SelectionChangedEventHandler(AssociatedObject_SelectionChanged);
}
}
}
To use this in XAML: (make sure you have included
xmlns:fw="clr-namespace:MVVM.Framework"
in your header).
<sdk:DataGrid AutoGenerateColumns="true" ItemsSource="{Binding ObjectList}" SelectedItem="{Binding SelectedObject, Mode=TwoWay}" Name="dataGridObjects">
<i:Interaction.Behaviors>
<fw:ScrollIntoViewBehavior/>
</i:Interaction.Behaviors>
</sdk:DataGrid>