2013-04-10 52 views
0

我有一個ListView控件,支持增量加載大型項目集合。當用戶向下滾動到底部ListView的垂直滾動條時,觸發附加項的加載。我努力在實現中使用MVVM模式(沒有代碼隱藏),但恕我直言,在這種特殊情況下,它不是必需的。從WPF控件提高用戶定義的事件

我在介紹一個新事件(例如NeedsMoreItems)和可能的子類ListView(ListViewWithIncrementalLoading),以便應用程序不需要執行ScrollChanged事件映射。我之前沒有爲XAML控件實現自定義事件,所以我不太確定實現這一點的最簡單方法。我是否需要創建自定義控件?用戶控制?使用附加事件?

如果你有類似任務的代碼片段,我會非常感激。

+0

在這裏不能真正添加​​任何東西到這個問題,這是廣泛的在我看來。但是,還是普遍認爲「好」MVVM不惜代價避免代碼?在許多情況下,代碼隱藏是無法避免的,而你不應該這樣做。你應該做的是從業務邏輯和設計中分離UI邏輯,這就是MVVM的全部原因。 – dowhilefor 2013-04-10 16:02:06

+0

我更新了我的帖子,補充說下面的MVVM模式在這種情況下可能不是必需的。我們不關注MVVM,更多的是關於如何使用用戶定義的事件來擴展控件。 – 2013-04-10 16:43:38

回答

1

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

+0

非常感謝您的回覆,感謝您的回覆。這是一個很好的提示,但是我會努力找到一個更可重用的解決方案,這樣我就可以通過定義一個自定義甚至(仍然需要弄清楚如何去做)或子類化控件來封裝這個行爲。 – 2013-04-17 19:11:07

+0

如果你找到解決方案,我會很高興知道這一點。 :-) – Akku 2013-04-18 10:06:54

相關問題