我写了以下扩展方法:
/// <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接口吗? 我的错误是什么?
答案 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()