2016-03-03 264 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'函数中调用它。然后,我会让视图订阅事件,并在事件触发时调用网格视图的刷新方法。 –