2011-12-12 9 views
5

Ho un controllo ListView che è associato a una raccolta osservabile. Quando gli oggetti vengono aggiunti alla raccolta osservabile, la lista non scorre automaticamente per mostrare l'elemento aggiunto più di recente. Sto cercando di aderire alle buone pratiche di WPF e vorrei evitare di scrivere codice nel code-behind della vista. C'è un modo semplice per farlo attraverso XAML o il codice del modello corrispondente?Esiste un modo semplice per fare in modo che ListView scorra automaticamente sull'elemento aggiunto più recentemente senza dover scrivere codice nel codice?

<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

So unica soluzione usando 'ListView.ScrollIntoView()' sarebbe interessante vedere la sola soluzione XAML – sll

risposta

2

È necessario creare un Attached Behavior che permetterà il vostro ListView per onorare il paradigma MVVM che è quello che si è in ultima analisi, dopo.

Una soluzione/esempio con ListBox (facilmente modificabile per un ListView) può essere trovato here.

9

È possibile utilizzare un comportamento Miscela:

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> 

(i Behavior e Interaction classi possono essere trovati in System.Windows.Interactivity.dll nella miscela SDK)

Problemi correlati