绑定到任意字典<,>通过使用转换器来投射对象

时间:2016-02-02 16:31:52

标签: c# dictionary reflection casting windows-runtime

我试图解决WinRT Xaml中的difficulties in binding to a Dictionary(也引用here)。我想使用转换器来执行此操作,而不是必须更改所有视图模型或业务代码以返回自定义键值类的列表。

这意味着我需要将一个对象转换为List<>某种类型。

    public object Convert(object value, Type targetType, object parameter, string temp)
    {
        if(value is IDictionary)
        {
            dynamic v = value;

            foreach (dynamic kvp in v)
            {

            }
        }
        return //some sort of List<>
    }

我不知道如何做到这一点。当我将鼠标悬停在调试器中的值时,它仍然记得它的相应类型(如Dictionary),但我不知道如何在运行时使用它。主要问题是转换函数在编译时不知道键或值的类型,因为我使用了多种类型的字典。

我需要做些什么才能将某些类型的对象(实际上保证为Dictionary&lt;,&gt;)转换为某种List,以便我可以在XAML中绑定它?

2 个答案:

答案 0 :(得分:1)

字典根本不是列表;你无法将它投射到某种类型的List<>。但它是IEnumerable,因此您可以迭代其KeyValuePair。或者您可以使用字典的 - 或其键。例如:

IDictionary<string, string> dictionary = value as IDictionary<string, string>;
if (dictionary != null)
{
    ICollection<string> keys = dictionary.Keys;
    ICollection<string> values = dictionary.Values;

    // Either of those can be bound to a ListView or GridView ItemsSource
    return values;
}

return null;

替换您用于string的任何类型。或者使用非通用版本:

IDictionary dictionary = value as IDictionary;
if (dictionary != null)
{
    ICollection keys = dictionary.Keys;
    ICollection values = dictionary.Values;

    // Either of those can be bound to a ListView or GridView ItemsSource
    return values;
}

return null;

答案 1 :(得分:0)

我找到了一个有效的解决方案,但我并不喜欢它。我不确定这是否会在稳定性或性能方面产生任何意想不到的后果。

<强> DictionaryConverter

使用自定义类和List以及动态转换字典。

id_rsa.pub

这允许绑定工作,幸运的是我只需要单向

<强> XAML

    public object Convert(object value, Type targetType, object parameter, string temp)
    {
        List<CustomKeyValue> tempList = new List<CustomKeyValue>();

        if(value is IDictionary)
        {
            dynamic v = value;

            foreach (dynamic kvp in v)
            {
                tempList.Add(new CustomKeyValue() { Key = kvp.Key, Value = kvp.Value });
            }
        }

        return tempList;
    }

    public class CustomKeyValue
    {
        public dynamic Key { get; set; }
        public dynamic Value { get; set; }
    }

因此,使用该转换器,我可以绑定任何类型的Dictionary&lt;,&gt;我的XAML中的对象。