使列表可观察

Make a List observable

我写了下面的扩展方法:

 /// <summary>
    /// make a Enumerable observable
    /// </summary>
    /// <typeparam name="T"></typeparam>
    /// <param name="enumerable"></param>
    /// <returns></returns>
    public static ObservableCollection<T> ToObservableCollection<T>(this IEnumerable<T> enumerable)
    {
        return new ObservableCollection<T>(enumerable);
    }

此方法目前有效。现在我有一个返回 IList 的转换器(参见 datagrid.SelectedItems):

using GalaSoft.MvvmLight.Command;
using System;
using System.Globalization;
using System.Windows.Controls;

namespace WOLF_APP.ViewModel
{
    public class SelectionChangedConverter : IEventArgsConverter
    {

        public object Convert(object value, object parameter)
        {
            var dataGrid = parameter as DataGrid;

            return dataGrid.SelectedItems;
        }

        public object ConvertBack(object value, Type targetType, object   parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

}

在我的 ViewModel 中,我想使用扩展方法将转换后的 IList 传递给 ObservableCollection。

 private RelayCommand<IList<object>> _fileSelectionChanged;
    public RelayCommand<IList<object>> FileSelectionChanged
    {
        get
        {
            if (_fileSelectionChanged == null)
            {
                _fileSelectionChanged = new RelayCommand<IList<object>>(
                    items =>
                    {
                        SelectedFiles = items.ToObservableCollection<FileInfo>();                            

                    }
                );
            }

            return _fileSelectionChanged;
        }
    }

我收到一个编译器错误,告诉我扩展方法需要一个 IEnumerable。 IList 不实现 IEnumerable 接口吗? 我的错误是什么?

问题在于编译器期望类型为 FileInfo 的项目,但您的 IList 包含 objects.

我把你的一些代码放到VS中,英文错误是...

'IList<object>' does not contain a definition for 'ToObservableCollection' and the best extension method overload 'Extensions.ToObservableCollection<FileInfo>(IEnumerable<FileInfo>)' requires a receiver of type 'IEnumerable<FileInfo>'

这是说它能找到的最接近的扩展方法是你写的那个,但是传递给它的类型不正确。 要解决此问题,我们只需将您的 objects 转换为 FileInfos。

这是一种方法(假设您的对象最初创建为 FileInfos)。

items.Cast<FileInfo>().ToObservableCollection()