mvvm, как войти в список просмотреть автоматическую прокрутку к новому Объекту в представлении списка

Я использую шаблон MVVM, у меня есть представление, которое создает новое ViewModel, после того, как пользовательские щелчки сохраняют, это представление закрывается, и отдельное представление открыто, который отображает набор моделей представления в a ListView.

Это ListView отсортирован в алфавитном порядке, таким образом, новое ViewModel может появиться у основания ListBox, который не сразу видим пользователю.

Мой вопрос состоит в том, как я получаю представление к автоматической прокрутке к недавно добавленному объекту?

Я предполагаю, что Это будет использовать присоединенные поведения, и ScrollIntoView событие на ListView, однако, который событие, которое я должен получить от GridView то, что я не уверен в..

Удачи

17
задан Dave Clemmer 7 September 2011 в 16:41
поделиться

2 ответа

Это решение для 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}"/>
15
ответ дан 30 November 2019 в 14:11
поделиться

Добавить выбранный элемент DependentcyProperty в класс, содержащий коллекцию. Привяжите к нему SelectedItem списка. После добавления новой модели в коллекцию установите выбранный элемент DependencyProperty.

2
ответ дан 30 November 2019 в 14:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: