当Datagrid的滚动条滚动到最后时,如何获得Caliburn Micro Action?

时间:2014-05-12 18:35:29

标签: c# wpf datagrid caliburn.micro

我有一个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事件?

1 个答案:

答案 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中这样做,我很乐意听到它。