Wpf 使用任务库加载ICollectionView

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

我有以下问题: 如果我将一个简单列表加载到绑定在wpf列表框上的ICollectionView中,则会按预期引发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解决了这个问题。