2017-05-25 45 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); 
    } 
}