2012-10-16 76 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? 

我希望這可以幫助別人!