這不是完整的代碼,因爲這是非常困難的開發,它是非常多的代碼(在軟件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