2017-05-25 41 views
0

在一個wpf項目中,我有一個列表視圖「綁定」到一個集合 每次我添加一個項目到集合我想專注於listview進入最後一行(加入的那一行) 該怎麼做?專注於綁定到集合的listview的最後一行 - wpf mvvm

//XAML 
<ListView 
       x:Name="logListActions" 
       Height="200" 
       MinHeight="150" 
       HorizontalAlignment="Stretch" 
       VerticalAlignment="Stretch" 
       Background="WhiteSmoke" 
       BorderThickness="1" 
       ItemsSource="{Binding LogMessages}"> 
       <ListView.View> 
        <GridView AllowsColumnReorder="True"> 
         <GridViewColumn 
          Width="110" 
          DisplayMemberBinding="{Binding When}" 
          Header="Data" /> 
         <GridViewColumn 
          Width="Auto" 
          DisplayMemberBinding="{Binding Message}" 
          Header="Messaggio" /> 
        </GridView> 
       </ListView.View> 
      </ListView> 



//ViewModel 
public ObservableCollection<LogMessage> LogMessages 
     { 
      get { return _logMessageList; } 
      set 
      { 
       _logMessageList = value; 
       OnPropertyChanged("LogMessages"); 
      } 
     } 

回答

1

增加新的項目到列表框之後,調用下面的代碼從代碼背後:

logListActions.ScrollIntoView(item); 
logListActions.SelectedItem = item; 
+0

哪裏在代碼後面?在xaml.cs文件或在viewmodel?在視圖模型中,控件「logListActions」不可訪問/可引用。 如果進入了xaml.cs中的哪個方法? – alex

+0

在xaml.cs.中但是你必須確定一些在ListView中添加新項目後觸發的事件。 –

+1

我在https://michlg.wordpress.com/2010/01/16/listbox-automatically-scroll-currentitem-into-view/上找到的另一個好方法。 –

0

綁定ListViewSelectedItem屬性設置爲LogMessage財產在你的視圖模型,而後者設置爲最後加入LogMessage對象:

<ListView ... ItemsSource="{Binding LogMessages}" SelectedItem="{Binding SelectedLogMessage}"> 

private LogMessage _selected; 
public LogMessage SelectedLogMessage 
{ 
    get { return _selected; } 
    set { _selected = value; OnPropertyChanged("SelectedLogMessage"); } 
} 

這將選擇最後一行。然後你可以在視圖中處理SelectionChanged事件,以便集中並突出顯示它:

private void logListActions_SelectionChanged(object sender, SelectionChangedEventArgs e) 
{ 
    if (e.AddedItems != null && e.AddedItems.Count > 0) 
    { 
     Dispatcher.BeginInvoke(new Action(() => 
     { 
      ListViewItem lvi = logListActions.ItemContainerGenerator.ContainerFromItem(e.AddedItems[0]) as ListViewItem; 
      if (lvi != null) 
       lvi.Focus(); 
     }), System.Windows.Threading.DispatcherPriority.Background); 
    } 
}