2011-11-14 51 views
2

我試圖實現使用MVVM一個列表視圖的自動滾動。我知道你可以通過調用ScrollIntoView來更新列表視圖,但是這需要我試圖避免的代碼隱藏。列表視圖自動滾動使用MVVM

我必將我的ListView的的ItemSource到一個ObservableCollection,想ListView控件自動向下滾動到添加到日誌的最新項目。

 <ListView ItemsSource="{Binding Log}" 
        SelectedIndex="{Binding SelectedLine}" 
        ScrollViewer.HorizontalScrollBarVisibility="Auto" 
        ScrollViewer.VerticalScrollBarVisibility="Auto" 
        Grid.Row="1"> 
      <ListView.ItemsPanel> 
       <ItemsPanelTemplate> 
        <VirtualizingStackPanel> 

        </VirtualizingStackPanel> 
       </ItemsPanelTemplate> 
      </ListView.ItemsPanel> 

      <ListView.ItemContainerStyle> 
       <Style TargetType="ListViewItem"> 
        <Setter Property="HorizontalContentAlignment" Value="Stretch" /> 
        <Setter Property="VerticalContentAlignment" Value="Top" /> 
       </Style> 
      </ListView.ItemContainerStyle> 

      <ListView.View> 
       <GridView> 

        <GridViewColumn Header="Type" Width="50"> 
         <GridViewColumn.CellTemplate> 
          <DataTemplate> 
           <TextBlock Text="{Binding Type}" HorizontalAlignment="Center"/> 
          </DataTemplate> 
         </GridViewColumn.CellTemplate> 
        </GridViewColumn> 
       </GridView> 
      </ListView.View> 


     </ListView> 
+1

作爲替代方法,您可以添加新的項目,使用「插入」,而不是「添加」收集的開始。有時這很有用,特別是在日誌的情況下(Windows事件查看器作爲示例),因爲新事件顯示在頂部。 That's不完全的回答你的問題,但如果這種方法在你的情況下,合理的,你那倒必須做自動滾動的。 – icebat

+1

在MVVM中使用Code-Behind沒有錯,如果它是特定於視圖的。例如,我經常使用代碼隱藏將焦點設置,運行動畫,改變控件的位置,等等。由於這些代碼視圖相關的,應該認爲後面跑,不符合商業邏輯視圖模型。 – Rachel

回答

2

MVVMAttached Behaviors齊頭並進。您可以使用附加的行爲滾動到新項目ObservableCollection.Add()發生之後......

article是試圖把樹視圖項爲滾動視圖,同時堅持MVVM一個很好的例子。