0

假设我将以下值加载到数据网格中

ID  |  Desc
------------------------ 
32     Red Cat
33     Blue Dog
34     Red Dog
37     Green Zebra
42     Reddish Snake
47     Greenlike Gorilla

我想按描述中指定的开始颜色对我的数据网格上的值进行分组。所以会是这样

ID  |  Desc
----------------------------
Red:
 32     Red Cat
 34     Red Dog
 42     Reddish Snake
Blue:
 33     Blue Dog
Green:
 37     Green Zebra
 47     Greenlike Gorilla

我的代码后面有这个:

PagedCollectionView pageView = new PagedCollectionView(IEnumerable<MyClass> main);
pageView.GroupDescriptions.Add(new PropertyGroupDescription("")); //?????
this.MyGrid.ItemsSource = pageView;

我将如何指定分组参数?

4

2 回答 2

1

您可以向IValueConverterGroupDescription 提供一个。所以使用:

new PropertyGroupDescription("Color", new StringToColorConverter())

其中StringToColorConverterDesc属性转换为颜色字符串:

public class StringToColorConverter: IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        if ((string)value == null) return null;
        return ((string)value).Split(new [] { ' ' }).FirstOrDefault();    
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

替代方法

如果您能够修改该类,那么您可以添加一个简单的派生属性Color

class MyClass
{
    public string Desc { get; set; }
    public int ID { get; set; }

    public string Color
    {
        get
        {
            return Desc.Split(new [] { ' ' }).FirstOrDefault();    
        }
    }
}

然后你就可以分组了。

new PropertyGroupDescription("Color")
于 2012-11-28T19:12:31.033 回答
0

PropertyGroupDescription 只是GroupDescription的一种实现。你可以自己滚动。事实上,我们可以为一般目的滚动一个:

public class LambdaGroupDescription<T> : GroupDescription
{
    public Func<T, object> GroupDelegate { get; set; }

    public LambdaGroupDescription(Func<T, object> groupDelegate)
    {
        this.GroupDelegate = groupDelegate;
    }

    public override object GroupNameFromItem(object item, int level, System.Globalization.CultureInfo culture)
    {
        return this.GroupDelegate((T)item);
    }
}   

然后将其添加到 PagedCollectionView:

var pageView = new PagedCollectionView(items);
        pageView.GroupDescriptions.Add(new LambdaGroupDescription<ViewModel>(
            vm => vm.Description.Split(' ').FirstOrDefault()    
        ));
        this.DataGrid.ItemsSource = pageView;

编辑

看来您的分组逻辑比简单的拆分要复杂一些。您可以尝试以下方法:

public string FormatColor(string color)
    {
        if (string.IsNullOrWhiteSpace(color)) return null;

        if (color.ToUpperInvariant().StartsWith("RED"))
            return "Red";

        if (color.ToUpperInvariant().StartsWith("GREEN"))
            return "Green";

        return color;
    }

进而:

pageView.GroupDescriptions.Add(new LambdaGroupDescription<ViewModel>(
            vm => FormatColor(vm.Description.Split(' ').FirstOrDefault() as string)
        ));

在 FormatColor 方法中,您还可以使用 Dictionary 将“奇怪”颜色值映射到已知颜色值:

    private static readonly Dictionary<string, string> ColorMap = new Dictionary<string, string>(){
        {"Greenlike", "Green"},
        {"Reddish", "Red"},
    };

public string FormatColor(string color)
    {
        if (string.IsNullOrWhiteSpace(color)) return null;

        if (ColorMap.ContainsKey(color))
            return ColorMap[color];

        return color;
    }
于 2012-11-28T19:44:57.380 回答