ИМХО, самый ясный способ сделать это - использовать «Поведение» через AttachedProperty
.AttachedProperty
- это механизм для расширения функциональности существующих элементов управления.
Сначала создайте класс для хранения AtachedProperty
, например:
public class ScrollViewerBehavior
{
public static bool GetAutoScrollToTop(DependencyObject obj)
{
return (bool)obj.GetValue(AutoScrollToTopProperty);
}
public static void SetAutoScrollToTop(DependencyObject obj, bool value)
{
obj.SetValue(AutoScrollToTopProperty, value);
}
public static readonly DependencyProperty AutoScrollToTopProperty =
DependencyProperty.RegisterAttached("AutoScrollToTop", typeof(bool), typeof(ScrollViewerBehavior), new PropertyMetadata(false, (o, e) =>
{
var scrollViewer = o as ScrollViewer;
if (scrollViewer == null)
{
return;
}
if ((bool)e.NewValue)
{
scrollViewer.ScrollToTop();
SetAutoScrollToTop(o, false);
}
}));
}
Это присоединенное свойство позволяет ScrollViewer
«магически» новое свойство типа Boolean
, действующее как DependencyProperty
в вашем XAML.Если вы связываете это свойство со стандартным свойством в вашей ViewModel, например:
private bool _reset;
public bool Reset
{
get { return _reset; }
set
{
_reset = value;
if(PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs("Reset"));
}
}
(опять же, ваше имя), а затем вы устанавливаете это свойство Reset
на true
, вашScrollViewer
прокрутит вверх.Я назвал AtachedProperty
AutoScrollToTop, но имя не имеет значения для этой цели.
XAML будет выглядеть примерно так:
<ScrollViewer my:ScrollViewerBehavior.AutoScrollToTop="{Binding Reset, Mode=TwoWay}">
<ListView>
<ListView.View>
<GridView>
<GridViewColumn
Header = "Name"
DisplayMemberBinding="{Binding Path=Name}"
/>
</GridView>
</ListView.View>
</ListView>
</ScrollViewer>
Примечание: my
- это пространство имен, в котором живет ваш класс ScrollViewerBehavior
.Например: xmlns:my="clr-namespace:MyApp.Behaviors"
Наконец, единственное, что вам нужно сделать в ViewModel, это установить Reset = true
, когда вам нравится, в вашем случае, когда вы добавляете или удаляете элемент из коллекции.