关注绑定到集合的listview的最后一行—wpf mvvm
在wpf项目中,我将listview“绑定”到集合 每次我向集合中添加一个项目时,我希望列表视图的焦点转到最后一行(添加的那一行) 怎么做关注绑定到集合的listview的最后一行—wpf mvvm,wpf,mvvm,data-binding,wpf-controls,Wpf,Mvvm,Data Binding,Wpf Controls,在wpf项目中,我将listview“绑定”到集合 每次我向集合中添加一个项目时,我希望列表视图的焦点转到最后一行(添加的那一行) 怎么做 //XAML <ListView x:Name="logListActions" Height="200" MinHeight="150" HorizontalAlignment="Stretch"
//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");
}
}
//XAML
//视图模型
公共可观察收集日志消息
{
获取{return\u logMessageList;}
设置
{
_logMessageList=值;
OnPropertyChanged(“日志消息”);
}
}
将新项目添加到列表框后,从代码隐藏调用以下代码:
logListActions.ScrollIntoView(item);
logListActions.SelectedItem = item;
将
ListView
的SelectedItem
属性绑定到视图模型中的LogMessage
属性,并将后者设置为最后添加的LogMessage
对象:
<ListView ... ItemsSource="{Binding LogMessages}" SelectedItem="{Binding 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);
}
}
代码隐藏在哪里?在xaml.cs文件中还是在viewmodel中?在视图模型中,控件“logListActions”不可访问/引用。如果进入xaml.cs的哪个方法?在xaml.cs中。但您必须确定在向ListView添加新项后触发的某个事件。我在上找到的另一个好方法。
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);
}
}