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