在我的应用程序中,用户可以选择大量实体,并生成绑定到选择的DataGrid
。因为这个数量可能是数千而且它会达到我只感兴趣的表现,比如说20。
实体可以有多种类型,但它们都来自一个名为Card
的类。
在我的SelectionView中我有这样的东西:
<DataGrid x:Name="gridGrids" dgx:DataGridFilter.IsAutoFilterEnabled="True" Style="{StaticResource DataGridSelection}"
ItemsSource="{Binding GridsSelected, IsAsync=True, Converter={local:LimitItemsConverter}}">
我当前的转换器手动检查该集合中项目的类型,它们只需要20:
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
if (value == null) { return null; }
List<Element> elements = value as List<Element>;
List<Grid> grids = value as List<Grid>;
List<Prop> props = value as List<Prop>;
List<Mat> mats = value as List<Mat>;
bool listElements = elementos != null && elementos.Any();
bool listGrids = grids != null && grids.Any();
bool listProps = props != null && props.Any();
bool listMats = mats != null && mats.Any();
int num = 20;
if (listElements )
{
if (elements.Count <= num)
{
return elements;
}
else
{
return elementos.Take(num).ToList();
}
}
if (listGrids)
{
if (grids.Count <= numero)
{
return grids;
}
else
{
return grids.Take(num).ToList();
}
}
//and so on
}
来自Card
的每个派生类。我想简单地说一下这样的话:
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
if (value == null) { return null; }
List<Card> cards = value as List<Card>;
bool listCards = cards != null && cards.Any();
int num = 20;
if (listCards )
{
if (cards.Count <= num)
{
return cards;
}
else
{
return cards.Take(num).ToList();
}
}
return new List<Card>();
}
但是我的列表没有在List<Card> cards = value as List<Card>;
声明中出现,我不知道怎么能告诉我的电脑这样做。
答案 0 :(得分:0)
您无法向上传播和向下传播此类对象的集合,您需要单独枚举和投射每个项目。
object tempobj = new List<object>() {"jack", "cat", "hat"};
List<string> tempstring = tempobj as List<string>;
在这种情况下,tempstring将为null。
DataGrid确实支持内置的UI虚拟化,实现自己的数据虚拟化将具有挑战性!
答案 1 :(得分:0)
这就是我提出的:
public class LimitItemsConverter : BaseConverter, IValueConverter
{
public LimitItemsConverter()
{
}
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
if (value == null) { return null; }
int max = 20;
if (value.GetType().IsGenericType && value is IList)
{
var list = ((IList)value);
Type type = list.GetType().GetGenericArguments()[0];
Type genericListType = typeof(List<>).MakeGenericType(type);
var reducedList = (IList)Activator.CreateInstance(genericListType);
int min = Math.Min(max, list.Count);
for (int i = 0; i < min; i++)
{
reducedList.Add(list[i]);
}
return reducedList;
}
return null;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
return null;
//throw new NotImplementedException();
}
}
我获取列表中对象的类型,然后创建一个临时列表,其中我只保留20个项目。我想知道是否有更好的方法来做到这一点。感谢