Я использую шаблон MVVM, у меня есть представление, которое создает новое ViewModel
, после того, как пользовательские щелчки сохраняют, это представление закрывается, и отдельное представление открыто, который отображает набор моделей представления в a ListView
.
Это ListView
отсортирован в алфавитном порядке, таким образом, новое ViewModel
может появиться у основания ListBox
, который не сразу видим пользователю.
Мой вопрос состоит в том, как я получаю представление к автоматической прокрутке к недавно добавленному объекту?
Я предполагаю, что Это будет использовать присоединенные поведения, и ScrollIntoView
событие на ListView
, однако, который событие, которое я должен получить от GridView
то, что я не уверен в..
Удачи
Это решение для ListBox, но оно может быть модифицировано для ListView... Это будет прокручивать выбранный элемент в просмотр, когда вы изменяете выбранный элемент из ViewModel.
Класс:
/// <summary>
/// ListBoxItem Behavior class
/// </summary>
public static class ListBoxItemBehavior
{
#region IsBroughtIntoViewWhenSelected
/// <summary>
/// Gets the IsBroughtIntoViewWhenSelected value
/// </summary>
/// <param name="listBoxItem"></param>
/// <returns></returns>
public static bool GetIsBroughtIntoViewWhenSelected(ListBoxItem listBoxItem)
{
return (bool)listBoxItem.GetValue(IsBroughtIntoViewWhenSelectedProperty);
}
/// <summary>
/// Sets the IsBroughtIntoViewWhenSelected value
/// </summary>
/// <param name="listBoxItem"></param>
/// <param name="value"></param>
public static void SetIsBroughtIntoViewWhenSelected(
ListBoxItem listBoxItem, bool value)
{
listBoxItem.SetValue(IsBroughtIntoViewWhenSelectedProperty, value);
}
/// <summary>
/// Determins if the ListBoxItem is bought into view when enabled
/// </summary>
public static readonly DependencyProperty IsBroughtIntoViewWhenSelectedProperty =
DependencyProperty.RegisterAttached(
"IsBroughtIntoViewWhenSelected",
typeof(bool),
typeof(ListBoxItemBehavior),
new UIPropertyMetadata(false, OnIsBroughtIntoViewWhenSelectedChanged));
/// <summary>
/// Action to take when item is brought into view
/// </summary>
/// <param name="depObj"></param>
/// <param name="e"></param>
static void OnIsBroughtIntoViewWhenSelectedChanged(
DependencyObject depObj, DependencyPropertyChangedEventArgs e)
{
ListBoxItem item = depObj as ListBoxItem;
if (item == null)
return;
if (e.NewValue is bool == false)
return;
if ((bool)e.NewValue)
item.Selected += OnListBoxItemSelected;
else
item.Selected -= OnListBoxItemSelected;
}
static void OnListBoxItemSelected(object sender, RoutedEventArgs e)
{
// Only react to the Selected event raised by the ListBoxItem
// whose IsSelected property was modified. Ignore all ancestors
// who are merely reporting that a descendant's Selected fired.
if (!Object.ReferenceEquals(sender, e.OriginalSource))
return;
ListBoxItem item = e.OriginalSource as ListBoxItem;
if (item != null)
item.BringIntoView();
}
#endregion // IsBroughtIntoViewWhenSelected
}
Добавьте xmlns к вашему представлению:
xmlns:util="clr-namespace:YourNamespaceHere.Classes"
Добавьте стиль к ресурсам Window/UserControl:
<Window.Resources>
<Style x:Key="ListBoxItemContainerStyle" TargetType="{x:Type ListBoxItem}"
BasedOn="{StaticResource {x:Type ListBoxItem}}">
<Setter Property="util:ListBoxItemBehavior.IsBroughtIntoViewWhenSelected" Value="true"/>
</Style>
</Window.Resources>
Реализуйте listbox:
<ListBox ItemsSource="{Binding MyView}"
DisplayMemberPath="Title"
SelectedItem="{Binding SelectedItem}"
ItemContainerStyle="{StaticResource ListBoxItemContainerStyle}"/>
Добавить выбранный элемент DependentcyProperty в класс, содержащий коллекцию. Привяжите к нему SelectedItem списка. После добавления новой модели в коллекцию установите выбранный элемент DependencyProperty.