2012-10-16 65 views
2

我不知道为什么我的ICollectionView没有刷新。任何人都可以解释我做错了什么?为什么不刷新ICollectionView?

我做了一个视图模型是这样的:

class ViewModel : INotifyPropertyChanged 
{ 
    private ObservableCollection<Entity> m_entities = new ObservableCollection<Entity>(); 
    public ICollectionView EntitiesView { get; private set; } 
    public ICollectionView HighCountView { get; private set; } 

    public ViewModel() 
    { 
     m_entities.Add(new Entity() { Id = 1, Name = "Erik", Description = "The first" }); 
     m_entities.Add(new Entity() { Id = 2, Name = "Olle", Description = "The second" }); 
     m_entities.Add(new Entity() { Id = 3, Name = "Kim", Description = "The last" }); 


     EntitiesView = CollectionViewSource.GetDefaultView(m_entities); 
     EntitiesView.CurrentChanged += new EventHandler(EntitiesView_CurrentChanged); 

     HighCountView = new CollectionView(m_entities); 
     using (HighCountView.DeferRefresh()) 
     { 
      HighCountView.Filter = e => ((Entity)e).Count > 3; 
     } 

    } 

    private void EntitiesView_CurrentChanged(object sender, EventArgs e) 
    { 
     Entity current = EntitiesView.CurrentItem as Entity; 
     if(current!=null) 
     { 
      current.Count++; 
      HighCountView.Refresh();   // Do I need this line? 
      OnPropertyChanged("HighCountView"); // or this? 
     } 
    } 

...在我的窗口,我用它作为DataContext的,就像这样:

public partial class MainWindow : Window 
{ 
    private ViewModel vm = new ViewModel(); 
    public MainWindow() 
    { 
     InitializeComponent(); 
    } 

    private void Window_Loaded(object sender, RoutedEventArgs e) 
    { 
     this.DataContext = vm; 
    } 
} 

...和我在做我绑定在XAML代码是这样的:

<ListBox Grid.Column="0" x:Name="listView1" DisplayMemberPath="Name" ItemsSource="{Binding EntitiesView}" IsSynchronizedWithCurrentItem="True" /> 
    <ListView Grid.Column="1" x:Name="listView2" DisplayMemberPath="Name" ItemsSource="{Binding HighCountView}" IsSynchronizedWithCurrentItem="True" /> 

的问题是,所有三个实体总是在listView2 DES所示我认为我设置了Filter-property。为什么?

编辑

要做出样品齐全,这里是实体类。

class Entity : INotifyPropertyChanged 
{ 
    private int m_id; 
    public int Id 
    { 
     bla bla..... 
    } 

    private string m_name; 
    public string Name 
    { 
     bla bla..... 
    } 

    private string m_description; 
    public string Description 
    { 
     bla bla..... 
    } 


    private int m_count; 
    public int Count 
    { 
     get { return m_count; } 
     set 
     { 
      if (value != m_count) 
      { 
       m_count = value; 
       OnPropertyChanged("Count"); 
      } 
     } 
    } 

    public void Update() 
    { 
     Description = "Updated: " + (++Count).ToString() + " times."; 
    } 
+0

请添加实体类的代码。 – Ekk

+0

现在是添加的实体类。 –

+0

你可以试试这个:var savedhighcount = HighCountView; HighCountView = null; OnPropertyChanged( “HighCountView”); HighCountView = savedhighcount; OnPropertyChanged( “HighCountView”); .....只在底部的构造函数中执行此操作....不在CurrentChanged中。 –

回答

1

最后我发现什么是错的。

如果我改变行:

HighCountView = new CollectionView(m_entities); 

这个

HighCountView = new ListCollectionView(m_entities); 

那么它的工作原理的预期。

我也可以删除此行

 OnPropertyChanged("HighCountView"); // or this? 

我希望这可以帮助别人!