使列表可观察
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 包含 object
s.
我把你的一些代码放到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>'
这是说它能找到的最接近的扩展方法是你写的那个,但是传递给它的类型不正确。
要解决此问题,我们只需将您的 object
s 转换为 FileInfo
s。
这是一种方法(假设您的对象最初创建为 FileInfos)。
items.Cast<FileInfo>().ToObservableCollection()
我写了下面的扩展方法:
/// <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 包含 object
s.
我把你的一些代码放到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>'
这是说它能找到的最接近的扩展方法是你写的那个,但是传递给它的类型不正确。
要解决此问题,我们只需将您的 object
s 转换为 FileInfo
s。
这是一种方法(假设您的对象最初创建为 FileInfos)。
items.Cast<FileInfo>().ToObservableCollection()