Wpf 使用任务库加载ICollectionView
我有以下问题: 如果我将一个简单列表加载到绑定在wpf列表框上的ICollectionView中,则会按预期引发CurrentChanged事件:Wpf 使用任务库加载ICollectionView,wpf,multithreading,icollectionview,Wpf,Multithreading,Icollectionview,我有以下问题: 如果我将一个简单列表加载到绑定在wpf列表框上的ICollectionView中,则会按预期引发CurrentChanged事件: List<int> l = new List<int>(); l.Add(1); l.Add(2); MyCollection = CollectionViewSource.GetDefaultView(l); MyCollection.CurrentChanged += MyCollection_CurrentChanged
List<int> l = new List<int>();
l.Add(1);
l.Add(2);
MyCollection = CollectionViewSource.GetDefaultView(l);
MyCollection.CurrentChanged += MyCollection_CurrentChanged; // ok, it's raised
但是,假设我正在将数据加载到另一个线程中,那么,我想要相同的行为,即引发currentChanged事件,但它不起作用:
List<int> l = new List<int>();
Task.Factory.StartNew(() =>
{
l.Add(1);
l.Add(2);
})
.ContinueWith((r) =>
{
MyCollectio = CollectionViewSource.GetDefaultView(l);
MyCollectio.CurrentChanged += MyCollectio_CurrentChanged; // ko, it isn't raised.
}, TaskScheduler.FromCurrentSynchronizationContext());
请注意,我正在使用TaskScheduler.FromCurrentSynchronizationContext来处理UI线程,但它不起作用。我还尝试了Application.Current.Dispatcher.Invoke,但没有成功。我认为根本原因在于xaml 如果您正在使用或任何其他源中的,请尝试设置为True,如下所示:
<ListBox ItemsSource="{Binding MyCollectio}"
IsSynchronizedWithCurrentItem="True"
/>
我已经试过了,不管有没有,效果都很好
在MainWindow.xaml.cs中,我有一个尝试,xaml应该包含上面提到的列表框:
public MainWindow()
{
InitializeComponent();
MyVM con = new MyVM();
DataContext = con;
List<int> l = new List<int>();
Task.Factory.StartNew(() =>
{
l.Add(1);
l.Add(2);
l.Add(3);
l.Add(4);
l.Add(5);
l.Add(6);
})
.ContinueWith((r) =>
{
con.MyCollectio = CollectionViewSource.GetDefaultView(l);
con.MyCollectio.CurrentChanged += MyCollectio_CurrentChanged;
}, TaskScheduler.FromCurrentSynchronizationContext());
}
void MyCollectio_CurrentChanged(object sender, EventArgs e)
{
MessageBox.Show("Curren really changed!!!");
}
...
public class MyVM : ViewModelBase
{
public ICollectionView MyCollectio
{
get
{
return _MyCollectio;
}
set
{
_MyCollectio = value;
RaisePropertyChanged("MyCollectio");
}
}
private ICollectionView _MyCollectio;
}
...
public class ViewModelBase : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
public void RaisePropertyChanged(string propertyName)
{
var handler = PropertyChanged;
if (handler != null)
handler(this, new PropertyChangedEventArgs(propertyName));
}
}
您使用的是哪个版本的.net framework?我已经将IsSynchronizedWithCurrentItem设置为true,但是就像我的代码片段一样,它不起作用。我正在使用visual studio 2012和.NET Framework 4.0。我刚刚使用了您的代码,正如我所料,它不起作用。现在我将VS2013与.NET4.5一起使用。这似乎是不可能的!我通过将TaskScheduler.FromCurrentSynchronizationContext替换为TaskScheduler.Current解决了这个问题。