Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/14.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_Xaml_Events_Custom Controls - Fatal编程技术网

从WPF控件引发用户定义的事件

从WPF控件引发用户定义的事件,wpf,xaml,events,custom-controls,Wpf,Xaml,Events,Custom Controls,我有一个ListView控件,支持增量加载大型项目集合。当用户向下滚动到底部ListView的垂直滚动条时,会触发加载附加项。我努力在实现中使用MVVM模式(没有代码隐藏),但在这种特殊情况下,它不是必需的 我正在尝试引入一个新事件(例如NeedsMoritems)和子类ListView(ListViewWithIncrementalLoading),这样应用程序就不需要进行ScrollChanged事件映射。我以前没有为XAML控件实现自定义事件,所以我不太确定实现这一点的最简单方法是什么。我

我有一个ListView控件,支持增量加载大型项目集合。当用户向下滚动到底部ListView的垂直滚动条时,会触发加载附加项。我努力在实现中使用MVVM模式(没有代码隐藏),但在这种特殊情况下,它不是必需的

我正在尝试引入一个新事件(例如NeedsMoritems)和子类ListView(ListViewWithIncrementalLoading),这样应用程序就不需要进行ScrollChanged事件映射。我以前没有为XAML控件实现自定义事件,所以我不太确定实现这一点的最简单方法是什么。我需要创建自定义控件吗?用户控制?使用附加事件


如果您有类似任务的代码片段,我将非常感谢。

这不是完整的代码,因为这一切都很难开发,而且它是非常多的代码(在软件CCFinder中使用),它也不是完美的,但它做得很好

    <CCFinder:AnimatedScrollViewer VerticalScrollBarVisibility="{Binding IsItemsFound, Converter={StaticResource __boolToVisibilityConverter}}" Margin="36,211,38,72" 
                  ScrollChanged="ScrollViewer_ScrollChanged" HorizontalContentAlignment="Center" Focusable="False" x:Name="ScrolView1">

            <ItemsControl Name="_itemsControl"  ItemsSource="{Binding CurrentImages}"
            ...
所以重要的部分来了:在ViewModel类中,我将MaximumImages属性设置为更高的值。。。它从大约50开始,然后上升到251,然后在再次触发时上升到500。在MaximumImages的setter中,WPF框架被通知CurrentImages已更改,在CurrentImages getter中,我有许多笨拙的代码,它们意识到MaximumImages的数量现在比以前更高,并向CurrentImages添加了新项(全部在getter中)。不太好,但它可以工作,并且主要在ViewModel类中:

    public void ShowMoreTriggered()
    {
        if (Photos != null && !ShowMoreTriggeredActive && MaximumImages < Photos.Count)
        {
            ShowMoreTriggeredActive = true;
            ThreadPool.QueueUserWorkItem(delegate
                                             {
                                                 Thread.Sleep(1000);
                                                 MaximumImages = MaximumImages < 251 ? 251 : 500;
                                                 Thread.Sleep(1500);
                                                 ShowMoreTriggeredActive = false;
                                             });
        }
    }

    private int _maximumImages;
    public int MaximumImages
    {
        get
        {
            return _maximumImages;
        }
        set
        {
            _maximumImages = value;
            InvokePropertyChanged("MaximumImages");
            InvokePropertyChanged("CurrentImages");
        }
    }
public void ShowMoreTriggered()
{
if(照片!=null&&!ShowMoreTriggeredActive&&MaximumImages

当然,在scroll事件达到最低点的情况下,引发用户定义的事件会更优雅,但我想它只会产生更多的代码,而不是更少,因为无论如何它肯定会从ScrollChanged事件传播。

在这里不能真正补充这个问题,在我看来它太广泛了。但“好的”MVVM不惜一切代价避免代码落后,这仍然是一种普遍的看法吗?在很多情况下,代码隐藏是必须的,你无法避免,也不应该避免。你应该做的是将UI逻辑从业务逻辑和设计中分离出来,这就是MVVM的全部原因。我更新了我的帖子,补充说在这种特殊情况下,遵循MVVM模式可能不是必要的。让我们不再关注MVVM,更多的是关于如何使用用户定义的事件扩展控件。谢谢您,很抱歉没有响应这么长时间。这是一个很好的技巧,但是我会努力找到一个更可重用的解决方案,这样我就可以通过定义自定义(仍然需要弄清楚如何做)或子类化控件来封装此行为。如果您找到了解决方案,我将很高兴知道这一点。:-)
    public void ShowMoreTriggered()
    {
        if (Photos != null && !ShowMoreTriggeredActive && MaximumImages < Photos.Count)
        {
            ShowMoreTriggeredActive = true;
            ThreadPool.QueueUserWorkItem(delegate
                                             {
                                                 Thread.Sleep(1000);
                                                 MaximumImages = MaximumImages < 251 ? 251 : 500;
                                                 Thread.Sleep(1500);
                                                 ShowMoreTriggeredActive = false;
                                             });
        }
    }

    private int _maximumImages;
    public int MaximumImages
    {
        get
        {
            return _maximumImages;
        }
        set
        {
            _maximumImages = value;
            InvokePropertyChanged("MaximumImages");
            InvokePropertyChanged("CurrentImages");
        }
    }