我有一个WPF Datagrid,它显示来自后端系统的结构化日志。日志可能是巨大的,所以我一次只能获取几百个条目。当滚动条拇指击中“底部”时,我想触发检索更多条目。滚动区域。
我发现这个code-behind solution用于感知卷轴的结尾,但我使用的是Caliburn Micro。所以我尝试连接ScrollChanged事件,所以我可以在视图模型中处理它(不是我最喜欢的解决方案,但我似乎用完了选项)。 "显而易见的"
的隐式校准绑定cal:Message.Attach="[Event ScrollViewer.ScrollChanged] = [Action DoScrollAction($eventArgs)]"
不起作用,也没有明确的
<i:Interaction.Triggers>
<i:EventTrigger EventName="ScrollViewer.ScrollChanged">
<cal:ActionMessage MethodName="DoScrollAction">
<cal:Parameter Value="$eventargs" />
</cal:ActionMessage>
</i:EventTrigger>
</i:Interaction.Triggers>
的方法。 Caliburn Micro是否有针对这些附加事件的内容?是否有一个更好的事件用于感知数据网格中滚动区域的结尾,而我没有让我在视图模型中处理ScrollChanged事件?
答案 0 :(得分:0)
所以我在发布问题后发现Joymon's solution用于解决附加事件,并使用了他的RoutedEventTrigger类,并结合了在我的视图模型中感知滚动结束条件的代码。
记录中,以下是解决方案的部分:
xmlns:wpfCommon="clr-namespace:WPFCommon;assembly=WPFCommon"
...
<DataGrid x:Name="SCPLog">
<i:Interaction.Triggers>
<wpfCommon:RoutedEventTrigger RoutedEvent="ScrollViewer.ScrollChanged">
<cal:ActionMessage MethodName="DoScroll">
<cal:Parameter Value="$eventargs" />
</cal:ActionMessage>
</wpfCommon:RoutedEventTrigger>
</i:Interaction.Triggers>
</DataGrid>
Joymon的RoutedEventTrigger的一个变种,我把它放在我自己的WPFCommon库中:
public class RoutedEventTrigger : EventTriggerBase<DependencyObject>
{
public RoutedEvent RoutedEvent { get; set; }
protected override void OnAttached()
{
var behavior = base.AssociatedObject as Behavior;
var associatedElement = base.AssociatedObject as FrameworkElement;
if (behavior != null)
associatedElement = ((IAttachedObject)behavior).AssociatedObject as FrameworkElement;
if (associatedElement == null)
throw new ArgumentException("Routed Event trigger can only be associated to framework elements");
if (RoutedEvent != null)
associatedElement.AddHandler(RoutedEvent, new RoutedEventHandler(this.OnRoutedEvent));
}
void OnRoutedEvent(object sender, RoutedEventArgs args) { base.OnEvent(args); }
protected override string GetEventName() { return RoutedEvent.Name; }
}
使用视图模型中的滚动结束检测:
public void DoScroll(ScrollChangedEventArgs e)
{
var scrollViewer = e.OriginalSource as ScrollViewer;
if (scrollViewer != null && // Do we have a scroll bar?
scrollViewer.ScrollableHeight > 0 && // Avoid firing the event on an empty list.
scrollViewer.VerticalOffset == scrollViewer.ScrollableHeight && // Are we at the end of the scrollbar?
{
// Do your end-of-scroll code here...
}
}
如果有人知道处理滚动结束事件的更好方法,例如在XAML中这样做,我很乐意听到它。