WPF:自动滚动至最后一项
因此,在我的应用程序中,我打开特定的进程,读取其输出并将其放入我的WPF:自动滚动至最后一项,wpf,listview,binding,Wpf,Listview,Binding,因此,在我的应用程序中,我打开特定的进程,读取其输出并将其放入我的列表视图中: <ListView Name="listViewResults" ItemsSource="{Binding Results}"/> 因此,我创建了另一个属性: private string currentLog; public string CurrentLog { get { return currentLog; } set
列表视图中
:
<ListView Name="listViewResults"
ItemsSource="{Binding Results}"/>
因此,我创建了另一个属性
:
private string currentLog;
public string CurrentLog
{
get { return currentLog; }
set
{
currentLog = value;
NotifyPropertyChanged("CurrentLog");
}
}
并将其添加到我的OutputHandler方法中:
CurrentLog = line;
并在my列表视图中使用它
在myXAML中选择EdItem属性
:
<ListView Name="listViewResults"
ItemsSource="{Binding Results}"
SelectedItem="{Binding CurrentLog}"/>
结果是,我仍然需要手动向下滚动。在列表视图中选择一个项目不会自动滚动到视图中,您不能仅在XAML中这样做,但有一种替代代码隐藏的方法。您可以编写自定义行为。行为是可以附加到XAML中控件的可恢复组件
为此,请将Nuget包安装到您的项目中。然后创建一个派生自行为的类型,如下所示
public class ScrollIntoSelectedItemBehavior : Behavior<ListView>
{
protected override void OnAttached()
{
base.OnAttached();
AssociatedObject.SelectionChanged += OnSelectionChanged;
}
protected override void OnDetaching()
{
base.OnDetaching();
AssociatedObject.SelectionChanged -= OnSelectionChanged;
}
private void OnSelectionChanged(object sender, SelectionChangedEventArgs e)
{
var selectedItem = AssociatedObject.SelectedItem;
if (selectedItem != null)
AssociatedObject.ScrollIntoView(selectedItem);
}
}
将交互
类型的XML命名空间添加到XAML文件中
xmlns:b="http://schemas.microsoft.com/xaml/behaviors"
就这样。当您设置不同的CurrentLog
项目时,它将自动滚动到视图中
我还想指出您设计中的一个潜在问题。您的结果
集合包含字符串类型的项
。如果存在重复项,您将遇到意外行为
让项目42成为“Test”
,然后添加同样拼写为“Test”
的项目102,列表将滚动到项目42,因为两个项目相等,并且列表中的第一个项目获胜。为了解决此问题,您必须创建一个自定义数据类型作为实际字符串的包装,例如:
public MyDataItem
{
public string Log { get; }
public MyDataItem(string log)
{
Log = log;
}
// ...
}
这将起作用,因为引用将被比较,而不是字符串,并且它们是唯一的。请看这个问题:我正在使用WPF,有没有机会使用XAML而不是代码隐藏来实现这一点?@DanaYeger到底什么不起作用?您的结果项是否已添加并显示在列表视图中?SelectedItem
是否设置为当前添加的项目,例如,您是否看到列表视图中的选项发生了变化?您的OutputHandler
方法未显示您将新项目分配给CurrentLog
。我可以看到新项目添加到我的列表中,但我需要手动滚动,我正在使用此CurrentLog,并将其绑定到我的ListView中,如我在post@DanaYeger添加项目时,您是否在列表视图中看到选择更改为新添加的项目?不,我没有看到,也没有使用任何选项style@DanaYeger我就是这么想的。问题不在行为中,而是您的绑定不工作,CurrentLog
属性未设置或未正确设置,或者未引发属性更改事件,或者未针对错误的属性引发或未正确实现。查找属性名称中的键入错误。输出窗口中是否存在绑定错误?
<ListView Name="listViewResults"
ItemsSource="{Binding Results}"
SelectedItem="{Binding CurrentLog}">
<b:Interaction.Behaviors>
<local:ScrollIntoSelectedItemBehavior/>
</b:Interaction.Behaviors>
</ListView>
xmlns:b="http://schemas.microsoft.com/xaml/behaviors"
public MyDataItem
{
public string Log { get; }
public MyDataItem(string log)
{
Log = log;
}
// ...
}