Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
WPF:自动滚动至最后一项_Wpf_Listview_Binding - Fatal编程技术网

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
列表视图中使用它
在my
XAML中选择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;
   }

   // ...
}