WPF MVVM应用程序-ICollectionView/线程/一般问题

WPF MVVM应用程序-ICollectionView/线程/一般问题,wpf,mvvm,Wpf,Mvvm,关于构建WPF MVVM应用程序,我有几个问题 1) 我将ICollectionView对象用于数据绑定控件,如ListView和ComboBox。我发现这是访问/跟踪这些控件中选定项的最简单方法。替换ICollectionView内容的最佳方法是什么?目前我是这样做的: private ICollectionView _files; public ICollectionView Files { get { return _files; } } void _service_G

关于构建WPF MVVM应用程序,我有几个问题

1) 我将ICollectionView对象用于数据绑定控件,如ListView和ComboBox。我发现这是访问/跟踪这些控件中选定项的最简单方法。替换ICollectionView内容的最佳方法是什么?目前我是这样做的:

    private ICollectionView _files;

public ICollectionView Files {
    get { return _files; }
}

void _service_GetFilesCompleted(IList<SomeFile> files) {
    this.IsProcessing = false;
    _files = CollectionViewSource.GetDefaultView(files);
    _files.CurrentChanged += new EventHandler(FileSelectionChanged);
    OnPropertyChanged("Files");
}
最后,我意识到有许多MVVM框架项目可以处理其中的一些需求。但是,我想了解如何使用内置功能实现上述功能


谢谢

如果您有列表视图和组合框,那么您真的应该考虑使用
可观察集合
绑定到这些控件。从集合中添加和删除项将自动通知控件属性已更改


如果您正在进行后台处理,则可以查看BackgroundWorker或Dispatchermer来处理UI的更新。它们都具有在UI线程上执行操作的能力,并且可以是线程安全的。

如果您有ListView和ComboBox,那么您应该考虑使用
ObservableCollection来绑定这些控件。从集合中添加和删除项将自动通知控件属性已更改


如果您正在进行后台处理,则可以查看BackgroundWorker或Dispatchermer来处理UI的更新。它们都具有作用于UI线程的功能,并且可以是线程安全的。

要从组合框中获取所选项目,请公开INotifyCollectionChanged对象(如ObservableCollection)并将其绑定到itemsource,然后为当前项目和绑定组合框创建另一个属性。SelectedItem(或ComboBox.SelectedValue,如果需要)添加到集合中。更新集合时,您需要管理选择

从表面上看,ICollectionView似乎是一个显而易见的选择,但WPF实现确实迫使您着手处理一些不应该遇到麻烦的线程代码


我最近使用了ICollectionView和CollectionViewSource(用于过滤)现在,我可能要回到上面描述的方法。

要从组合框中获取所选项目,请公开INotifyCollectionChanged对象,例如ObservableCollection,并将其绑定到itemsource,然后为当前项目创建另一个属性,然后将ComboBox.SelectedItem(或ComboBox.SelectedValue,如果需要)绑定到该集合。更新集合时,您需要管理选择

从表面上看,ICollectionView似乎是一个显而易见的选择,但WPF实现确实迫使您着手处理一些不应该遇到麻烦的线程代码


我最近使用了ICollectionView和CollectionViewSource(用于过滤)并且对出现了多少调度程序问题感到沮丧。今天,我可能要回到上面描述的方法。

我从不需要从集合中添加/删除单个项;集合总是被替换。此外,ICollectionView似乎是从ListView获取当前项的最简单方法,除非您可以建议一个替代方案。是的,我知道BackgroundWorker-请查看我关于多个任务的问题。我从不需要从集合中添加/删除单个项目;集合总是被替换。此外,ICollectionView似乎是从列表视图获取当前项目的最简单方法,除非您可以建议一个替代方案。是的,我知道关于BackgroundWorker-请查看我关于多个任务的问题。
    public void BeginGetFiles()
    {
        ThreadStart thread = () => {
            var result = _serviceClient.GetUserFiles(username, password);
            GetFilesCompleted(result.Files);
        };

        new Thread(thread).Start();
    }