Wpf 为什么不刷新ICollectionView?
我不明白为什么我的ICollectionView没有刷新。谁能解释我做错了什么 我制作了一个viewmodel,如下所示:Wpf 为什么不刷新ICollectionView?,wpf,data-binding,icollectionview,Wpf,Data Binding,Icollectionview,我不明白为什么我的ICollectionView没有刷新。谁能解释我做错了什么 我制作了一个viewmodel,如下所示: class ViewModel : INotifyPropertyChanged { private ObservableCollection<Entity> m_entities = new ObservableCollection<Entity>(); public ICollectionView EntitiesView { g
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?
}
}
public partial class MainWindow : Window
{
private ViewModel vm = new ViewModel();
public MainWindow()
{
InitializeComponent();
}
private void Window_Loaded(object sender, RoutedEventArgs e)
{
this.DataContext = vm;
}
}
<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" />
…我在XAML代码中进行绑定,如下所示:
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?
}
}
public partial class MainWindow : Window
{
private ViewModel vm = new ViewModel();
public MainWindow()
{
InitializeComponent();
}
private void Window_Loaded(object sender, RoutedEventArgs e)
{
this.DataContext = vm;
}
}
<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" />
最后我发现了问题所在 如果我更改行:
HighCountView = new CollectionView(m_entities);
对此
HighCountView = new ListCollectionView(m_entities);
然后,它会以预期的方式工作
我也可以删除这一行
OnPropertyChanged("HighCountView"); // or this?
我希望这能帮助别人 请添加实体类的代码。现在是添加的实体类。您可以尝试以下操作:var savedhighcount=HighCountView;HighCountView=null;OnPropertyChanged(“HighCountView”);HighCountView=savedhighcount;OnPropertyChanged(“HighCountView”)。。。。。仅在底部的构造函数中执行此操作…而不是在CurrentChanged中。没有任何区别…:(我不知道这是否是问题所在,但一般来说,您不直接实例化CollectionView。相反,您应该创建CollectionViewSource的新实例并获取相应的视图。让引擎决定使用HighCountView=new CollectionViewSource{Source=m_entities}的最佳实现是什么。视图;它有帮助!)