使列表可观察

时间:2018-02-27 17:26:00

标签: c# mvvm mvvm-light

我写了以下扩展方法:

 /// <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中,我想使用扩展方法将converterted 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。 ILin不会实现IEnumerable接口吗? 我的错误是什么?

1 个答案:

答案 0 :(得分:1)

问题在于编译器期望FileInfo类型的项目,但您的IList包含object s。

我将一些代码放入VS中,而英文错误是......

  

&#39;&IList的LT;对象&gt;&#39;不包含&#39; ToObservableCollection&#39;的定义和最好的扩展方法重载&#39; Extensions.ToObservableCollection&lt; FileInfo&gt;(IEnumerable&lt; FileInfo&gt;)&#39;需要一个类型为“IEnumerable&lt; FileInfo&gt;&#39;

的接收器

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

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

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