2013-11-21 79 views
0

我是WPF和C#的新手,并且主要是通过使用代码示例构建我的第一个应用程序。我相信可能有更好的方法来做到这一点,我还没有理解,所以我会向你们提出一些建议。wpf如何刷新绑定的viewmodel

我有一堆嵌套对象的treeview控件,这些嵌套对象从我也构建的WCF服务中下载到ObservableCollection viewmodel中。我在XAML的Windows.Resources中声明了viewmodel。

我树状然后结合到静态资源通过它的键名。

项= “{绑定源= {StaticResource的MyCatalogModel},路径=项目,模式=双向,UpdateSourceTrigger =的PropertyChanged}”

在树中的数据保存在本地的文件。当视图模型被实例化时,它读取该文件,或者如果该文件不存在,则创建该文件。

我现在有2个相关的问题。

  1. 有时导入的数据对象相当大,有很多嵌套的对象(子对象)。这需要很长时间来更新树。我如何加快速度?我可以“关闭”通知ObservableCollection的变化的东西,并刚刚完成时重新加载(重新绑定)视图模型?

  2. 我想让用户能够基本清除树中的所有项目并从头开始。我有转储底层文件的代码,正如我所说,当新的视图模型被实例化时,它将被重新创建,但我不知道如何“重置”资源和树的绑定。我该怎么做呢?

感谢所有人的回应和任何代码片段将不胜感激!

+0

您可以通过1)将TreeView绑定到视图模型上的一个属性(就像您已经拥有'Items'一样),从而加快TreeView的速度。 2)当你加载你的数据时,在本地变量中创建* new *'ObservableCollection'并将数据加载到它中。 3)最后,将局部变量赋值给'Items'属性。这会导致TreeView重新绑定/刷新到已经填充的新ObservableCollection的内容,而不是更新所发生的每个INotifyCollectionChanged事件。 – Steve

回答

0

我有一个类似的问题,我在一个集合中有非常大量的数据 - 并且OnPropertyChanged事件正在为集合中的每个项目触发。我添加了一个扩展和一个方法来添加一个范围到ObservableCollection。这是扩展的代码。

public class SmartCollection<T> : ObservableCollection<T> 
{ 
    public SmartCollection() 
     : base() 
    { 
     _suspendCollectionChangeNotification = false; 
    } 


    bool _suspendCollectionChangeNotification; 

    protected override void OnCollectionChanged(NotifyCollectionChangedEventArgs e) 
    { 
     if (!_suspendCollectionChangeNotification) 
     { 
      base.OnCollectionChanged(e); 
     } 
    } 

    public void SuspendCollectionChangeNotification() 
    { 
     _suspendCollectionChangeNotification = true; 
    } 

    public void ResumeCollectionChangeNotification() 
    { 
     _suspendCollectionChangeNotification = false; 
    } 


    public void AddRange(IEnumerable<T> items) 
    { 
     this.SuspendCollectionChangeNotification(); 
     int index = base.Count; 
     try 
     { 
      foreach (var i in items) 
      { 
       base.InsertItem(base.Count, i); 
      } 
     } 
     finally 
     { 
      this.ResumeCollectionChangeNotification(); 
      var arg = new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Reset); 
      this.OnCollectionChanged(arg); 
     } 
    } 

} 

所以不是一个ObservableCollection的一个SmartCollection。我所做的是将我的对象集合构建到List中,然后调用AddRange方法并传入对象列表。这大大提高了性能。

至于重建树 - 如果它基于viewmodel。只是新增了它所绑定的视图模型。

0

相同的老问题一次又一次出现的次数很惊人。对,我不知道你为什么BindingStaticResource,但这是一个坏主意。

在您的视图模型只要创建ObservableCollection<T>类型的public属性,设置它的实例为你喜欢或不知道无论怎样你的观点的DataContext。确保在后面的代码中正确实施INotifyPropertyChanged Interface,或者改为declare a DependencyProperty。然后你就可以直接Bind这个属性,让我们称之为Items

<TreeView ItemsSource="{Binding Items}" ... /> 

当你拥有它设置了这种方式,那么所有你需要做的,清空或重置TreeView这是(在视图模型) :

Items = new ObservableCollection<YourItemDataType>(); 

至于速度,很难知道自己在做什么,但WPF是已知的渲染大集合时正在缓慢。我无法帮助,对不起。