使用转换器限制数据网格项

时间:2014-10-20 20:07:29

标签: c# wpf casting converter

在我的应用程序中,用户可以选择大量实体,并生成绑定到选择的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>;声明中出现,我不知道怎么能告诉我的电脑这样做。

2 个答案:

答案 0 :(得分:0)

您无法向上传播和向下传播此类对象的集合,您需要单独枚举和投射每个项目。

object tempobj = new List<object>() {"jack", "cat", "hat"};
List<string> tempstring = tempobj as List<string>;

在这种情况下,tempstring将为null。

DataGrid确实支持内置的UI虚拟化,实现自己的数据虚拟化将具有挑战性!

https://social.msdn.microsoft.com/Forums/vstudio/en-US/9ea28468-5505-4e28-8220-e216b77ecf28/wpf-datagrid-and-virtualization

答案 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个项目。我想知道是否有更好的方法来做到这一点。感谢