Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 绑定到任意字典<&燃气轮机;通过使用转换器来强制转换对象_C#_Dictionary_Reflection_Casting_Windows Runtime - Fatal编程技术网

C# 绑定到任意字典<&燃气轮机;通过使用转换器来强制转换对象

C# 绑定到任意字典<&燃气轮机;通过使用转换器来强制转换对象,c#,dictionary,reflection,casting,windows-runtime,C#,Dictionary,Reflection,Casting,Windows Runtime,我正在尝试解决WinRT Xaml(也被引用)中的问题。我希望使用转换器来实现这一点,而不必更改所有视图模型或业务代码来返回自定义键值类的列表 这意味着我需要将一个对象强制转换为某种类型的列表 public object Convert(object value, Type targetType, object parameter, string temp) { if(value is IDictionary) { dyna

我正在尝试解决WinRT Xaml(也被引用)中的问题。我希望使用转换器来实现这一点,而不必更改所有视图模型或业务代码来返回自定义键值类的列表

这意味着我需要将一个对象强制转换为某种类型的列表

    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<>
    }
public object Convert(对象值、类型targetType、对象参数、字符串温度)
{
if(值为IDictionary)
{
动态v=数值;
foreach(v中的动态kvp)
{
}
}
return//某种类型的列表
}
但是我不知道怎么做。当我将鼠标移到调试器中的值上时,它仍然记得它的适当类型(如Dictionary),但我不知道如何在运行时使用它。主要问题是Convert函数在编译时不知道键或值的类型,因为我使用了多种类型的字典


我需要做什么才能将object类型的东西(保证它实际上是一个字典)转换成某种列表,这样我就可以在XAML中绑定到它?字典根本不是一个列表;您无法将其强制转换为某种类型的
列表。不过,它是一个
IEnumerable
,因此您可以迭代它的
KeyValuePair
s。或者您可以使用字典的值——或者它的键。例如:

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;

我已经找到了一个解决方案,它……有效,但我真的不喜欢它。我不确定这在稳定性或性能方面是否有任何意外后果

字典转换程序

使用自定义类和列表以及整个动力学来转换字典

    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; }
    }
public object Convert(对象值、类型targetType、对象参数、字符串温度)
{
列表模板列表=新建列表();
if(值为IDictionary)
{
动态v=数值;
foreach(v中的动态kvp)
{
Add(新的CustomKeyValue(){Key=kvp.Key,Value=kvp.Value});
}
}
返回圣殿骑士;
}
公共类CustomKeyValue
{
公共动态密钥{get;set;}
公共动态值{get;set;}
}
这允许绑定工作,幸运的是,对我来说,这只需要一种方式

XAML

        <ListView ItemsSource="{Binding MyDictionary, Converter={StaticResource DictionaryConverter}}">
            <ListView.ItemTemplate>
                <DataTemplate>
                    <StackPanel Orientation="Horizontal">
                        <TextBlock Text="{Binding Key}"/>
                        <TextBlock Text="  :  "/>
                        <TextBlock Text="{Binding Value}"/>
                    </StackPanel>
                </DataTemplate>
            </ListView.ItemTemplate>
        </ListView>


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

“Cast”措词不当。但让我困惑的是,函数不知道键和值的类型。如果我传入一本词典或一本词典,我希望它能起作用。您仍然可以使用非泛型版本来返回未知项的列表。如果收藏品一定知道如何处理它们,你应该很好。我现在明白了,谢谢你的帮助。唯一的另一个问题是键和值都是相关的。
        <ListView ItemsSource="{Binding MyDictionary, Converter={StaticResource DictionaryConverter}}">
            <ListView.ItemTemplate>
                <DataTemplate>
                    <StackPanel Orientation="Horizontal">
                        <TextBlock Text="{Binding Key}"/>
                        <TextBlock Text="  :  "/>
                        <TextBlock Text="{Binding Value}"/>
                    </StackPanel>
                </DataTemplate>
            </ListView.ItemTemplate>
        </ListView>