2016-03-03 118 views
1

我的網格:的DevExpress GridControl - 刷新數據MVVM

<dxg:GridControl x:Name="StatisticsGridLevel1" 
       dx:ThemeManager.ThemeName="Office2013" 
       DataContext="{Binding FooViewModel}" 
       ItemsSource="{Binding FooCollection}"> 

視圖模型:

private List<FooDto> fooCollection = new List<FooDto>(); 
public List<FooDto> FooCollection 
{ 
    get 
    { 
     return this.fooCollection; 
    } 

    private set 
    { 
     this.fooCollection = value; 
     this.NotifyPropertyChanged(); 
    } 
} 

和實例方法:

private void Foo() 
{ 
    foreach (var element in collection) 
    { 
     this.fooCollection.Add(new FooDto() 
     { 
      X = element.Foo1, 
      Y = element.Foo2, 
      Z = element.Foo3 
     }); 
    } 
    this.NotifyPropertyChanged("FooCollection"); 
} 

當我使用的ObservableCollection,一切工作正常。但我想使用列表(這不是在循環中通知)。

視圖在網格上的開始滾動後刷新。問題是什麼?

+0

爲什麼你不能堅持'ObservableCollection'?除非集合實現了'INotifyCollectionChanged',否則當集合被修改時,網格不會自動更新。 'ObservableCollection'實現了'List'接口。 –

+0

因爲我添加了很多項目的集合。我想在完成循環後刷新網格(手動調用Notify)。 – WymyslonyNick

+0

好吧,我明白了,但我不明白你的問題。這意味着什麼:'在網格上的開始滾動輪後刷新視圖'?什麼是開始滾動輪?你是指鼠標滾輪嗎?你正在處理鼠標滾輪事件嗎?如果是這樣,那聽起來像它可能與問題有關,你應該顯示代碼。這聽起來像你說'儘管你正在使用'List'而不是'ObservableCollection',這個視圖仍然在'Foo'中刷新?是對的嗎? –

回答

0

我認爲CollectionViewSource會適用於你的情況。在View的代碼隱藏方面,有很多方法可以用於在XAML中創建ViewModel。爲了演示目的,我將把最容易的一個放在一起,這會在ViewModel上創建一個CollectionViewSource屬性。我認爲有些人可能不一定喜歡這種方法 - 它有混合關注的感覺。不過,我不確定我是否同意。如果您認爲CollectionViewSource是集合視圖的對象模型,那麼在您的ViewModel中沒有看到任何錯誤。但我認爲,因爲它從DependencyObject繼承,它被視爲更受關注。無論如何,這樣的事情會做你想要什麼:

// Assuming this is your constructor 
public ViewModel() 
{ 
    this.FooViewSource.Source = this.fooCollection; 
} 

private readonly List<FooDto> fooCollection = new List<FooDto>(); 

private readonly CollectionViewSource fooViewSource; 
public CollectionViewSource FooViewSource 
{ 
    get { return this.fooViewSource; } 
} 

private void Foo() 
{ 
    foreach (var element in collection) 
    { 
     this.fooCollection.Add(new FooDto() 
     { 
      X = element.Foo1, 
      Y = element.Foo2, 
      Z = element.Foo3 
     }); 
    } 
    this.FooViewSource.View.Refresh(); 
} 

那麼你將你的ItemsSource屬性綁定到您的視圖模型的FooViewSource財產。 A CollectionViewSource對於其他事情也非常方便。它支持排序,過濾,選定的項目,也許還有一些我忘記的東西。

+0

您的解決方案修復了性能問題。但DevExpress阻止排序(當您點擊鼠標右鍵時,排序選項將變灰)。如果不是這個問題,這將是一個完美的解決方案。 – WymyslonyNick

+0

「GridControl」上是否有'AllowSorting'屬性可以設置爲true?請參閱此鏈接底部附近的「排序和分組」:https://documentation.devexpress.com/#WPF/CustomDocument11124。 –

+0

或者,如果上述不起作用。我會在網格控件上尋找某種默認視圖。我想會有一個,它可能有更多的功能刷新視圖。如果是這樣的話,我會在ViewModel中添加一個名爲類似'CollectionChanged'的事件,並在任何時候改變底層列表的時候從'Foo'函數中調用它。然後,我會讓視圖訂閱事件,並在事件觸發時調用網格視圖的刷新方法。 –