这不是完整的代码,因为这是非常困难的开发,它是非常多的代码(在软件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}"
...
在代码隐藏:
private void ScrollViewer_ScrollChanged(object sender, ScrollChangedEventArgs e)
{
if (e.VerticalOffset + e.ViewportHeight == e.ExtentHeight)
{
var scroller = ((ScrollViewer)sender);
scroller.ReleaseMouseCapture();
scroller.InvalidateScrollInfo();
((OverviewViewModel)this.DataContext).ShowMoreTriggered();
}
}
所以来这里的重要组成部分:在视图模型I类设置MaximumImages属性更高的价值......它始于50,然后升起当再次触发时为251,然后为500。在MaximumImages的setter中,WPF框架被通知CurrentImages已经改变,并且在CurrentImages获取器中,我有很多笨重的代码,它们意识到MaximumImages数字现在比以前更高,并且将新项目添加到CurrentImages(全部吸气剂)。不要太漂亮,但它的工作原理,并大多在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");
}
}
当然,这将是更优雅的提高的情况下,滚动事件到达最低点时,用户定义的事件,但我想它只会生成更多的代码,而不会更少,因为无论如何它肯定会从ScrollChanged事件传播。
在这里不能真正添加任何东西到这个问题,这是广泛的在我看来。但是,还是普遍认为“好”MVVM不惜代价避免代码?在许多情况下,代码隐藏是无法避免的,而你不应该这样做。你应该做的是从业务逻辑和设计中分离UI逻辑,这就是MVVM的全部原因。 – dowhilefor 2013-04-10 16:02:06
我更新了我的帖子,补充说下面的MVVM模式在这种情况下可能不是必需的。我们不关注MVVM,更多的是关于如何使用用户定义的事件来扩展控件。 – 2013-04-10 16:43:38