C# Windows通用应用程序:选择带有GridView和分组数据源的EdItem

C# Windows通用应用程序:选择带有GridView和分组数据源的EdItem,c#,xaml,uwp,C#,Xaml,Uwp,我有一个应用程序,用户必须选择一种颜色。主题颜色或自定义颜色。因为它们有不同的值,所以我有一个接口IColor和一个自定义颜色(ValueColor)的实现,如下所示: public sealed class ValueColor : INodeColor, IEquatable<ValueColor> { private readonly int color; public override bool Equals(object obj) {

我有一个应用程序,用户必须选择一种颜色。主题颜色或自定义颜色。因为它们有不同的值,所以我有一个接口IColor和一个自定义颜色(ValueColor)的实现,如下所示:

public sealed class ValueColor : INodeColor, IEquatable<ValueColor>
{
    private readonly int color;

    public override bool Equals(object obj)
    {
        return Equals(obj as ValueColor);
    }

    public bool Equals(INodeColor other)
    {
        return Equals(other as ValueColor);
    }

    public bool Equals(ValueColor other)
    {
        return other != null && other.color == color;
    }

    public override int GetHashCode()
    {
        return color.GetHashCode();
    }
}
当启用分组时,GridView返回到引用比较,当我确保每种颜色只有一个引用时,一切正常。我可以在这个场景中缓存它,但我还有另一个不可能的情况


这是错误还是设计造成的?

当您分组时,可能会覆盖布尔等于(对象obj),obj并不总是一个ValueColor,而是一个组对象?我看到了,看到了“as”操作符。我不知道这是否是设计造成的,但我一直认为是。为什么使用引用等式如此困难?毕竟,如果您执行
GroupedList.SelectedItem=newvaluecolor(16),假设列表中有一个值为16的ValueColor,对吗?你怎么知道的?只需将SelectedItem设置为已经存在的,因为这会使一切变得更加复杂。我有几个这样的场景,有很多数据。当我不想以内存泄漏结束时,我必须考虑缓存上下文。当这样的环境发生变化时,我还需要再次填写我的列表等等。我不明白为什么你需要一个“缓存”,或者如果你有一个,为什么它的生命周期很难管理。你的数据源就是你需要的所有“缓存”,不是吗?如果您有一个单独的集合,它的生存期可以链接到gridview的生存期。为什么这么复杂?
public class Group
{
    public List<INodeColor> Items { get; set; }

    public string Name { get; set; }
}
// Works:
GroupedList.SelectedItem = Groups[0].Items[5]; // = new ValueColor(16);

// Works not:
GroupedList.SelectedItem = new ValueColor(16);