2011-12-12 9 views
5

Tengo un ListView que está vinculado a una colección observable. A medida que se agregan elementos a la colección observable, la vista de lista no se desplaza automáticamente para mostrar el elemento agregado más recientemente. Intento cumplir con buenas prácticas de WPF y me gustaría evitar escribir cualquier código en el código subyacente de la vista. ¿Hay una manera simple de lograr esto a través del XAML o el código del Modelo correspondiente?¿Existe una manera simple de hacer que un ListView se desplace automáticamente al elemento agregado más recientemente sin tener que escribir ningún código en el código?

<ListView HorizontalAlignment="Center" ItemsSource="{Binding ScenarioSnippets}" Background="{x:Null}" 
         BorderBrush="{x:Null}" BorderThickness="0" SelectionMode="Single" VerticalAlignment="Top" 
         HorizontalContentAlignment="Center" IsSynchronizedWithCurrentItem="True"> 
       <ListView.ItemContainerStyle> 
        <Style TargetType="{x:Type ListViewItem}"> 
         <Setter Property="Focusable" Value="False" /> 
        </Style> 
       </ListView.ItemContainerStyle> 
       <ListView.View> 
        <GridView Selector.IsSelected="True" AllowsColumnReorder="False"> 
         <GridView.Columns> 
          <GridViewColumn CellTemplate="{StaticResource ScenarioSnippetItemCellTemplate}" 
              HeaderContainerStyle="{StaticResource GridViewHeaderStyle}" /> 
         </GridView.Columns> 
        </GridView> 
       </ListView.View> 
     </ListView> 
+0

sé única solución usando 'ListView.ScrollIntoView()' sería interesante ver solo la solución XAML – sll

Respuesta

2

Es necesario crear un Attached Behavior que permitirá que su ListView en honor al paradigma MVVM que es lo que es en última instancia después.

Una solución/ejemplo con ListBox (fácilmente modificado para un ListView) se puede encontrar here.

9

Se puede usar un comportamiento de fusión:

public class AutoScrollToLastItemBehavior : Behavior<ListBox> 
{ 
    protected override void OnAttached() 
    { 
     base.OnAttached(); 
     var collection = AssociatedObject.Items.SourceCollection as INotifyCollectionChanged; 
     if (collection != null) 
      collection.CollectionChanged += collection_CollectionChanged; 
    } 

    protected override void OnDetaching() 
    { 
     base.OnDetaching(); 
     var collection = AssociatedObject.Items.SourceCollection as INotifyCollectionChanged; 
     if (collection != null) 
      collection.CollectionChanged -= collection_CollectionChanged; 
    } 

    private void collection_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e) 
    { 
     if (e.Action == NotifyCollectionChangedAction.Add) 
     { 
      ScrollToLastItem(); 
     } 
    } 

    private void ScrollToLastItem() 
    { 
     int count = AssociatedObject.Items.Count; 
     if (count > 0) 
     { 
      var last = AssociatedObject.Items[count - 1]; 
      AssociatedObject.ScrollIntoView(last); 
     } 
    } 
} 

XAML:

<ListView ItemsSource="..."> 
    <i:Interaction.Behaviors> 
     <local:AutoScrollToLastItemBehavior /> 
    </i:Interaction.Behaviors> 
</ListView> 

(los Behavior y Interaction clases se pueden encontrar en System.Windows.Interactivity.dll en la mezcla SDK)

Cuestiones relacionadas