5

我已经阅读了许多关于将 Dictionary 绑定到 WPF ListView 和 ListBox 的帖子,但我无法获得在 WinRT 中工作的等效代码。

<Grid Margin="10" Width="1000" VerticalAlignment="Stretch">
        <ListBox Name="StatListView" ItemsSource="{Binding FooDictionary}" >
            <ListBox.ItemTemplate>
                <DataTemplate >
                    <Grid Margin="6">
                        <StackPanel Orientation="Horizontal" >
                            <TextBlock Text="{Binding Key}" Margin="5" />
                            <TextBlock Text="{Binding Value}" Margin="5" />
                        </StackPanel>
                    </Grid>
                </DataTemplate>
            </ListBox.ItemTemplate>
        </ListBox>
    </Grid>


    public Dictionary<string, string> FooDictionary
    {
        get
        {
            Dictionary<string, string> temp = new Dictionary<string, string>();
            temp.Add("key1", "value1");
            temp.Add("key2", "value2");
            temp.Add("key3", "value3");
            temp.Add("key4", "value4");
            return temp;
        }
    }

什么是正确的绑定?

4

2 回答 2

8

输出窗口中的错误是(修剪到最有用的部分):

Error: Cannot get 'Key' value (type 'String') from type 
'System.Runtime.InteropServices.WindowsRuntime.CLRIKeyValuePairImpl`2
[[System.String, mscorlib, Version=4.0.0.0, Culture=neutral, 
PublicKeyToken=b77a5c561934e089],[System.String, mscorlib, Version=4.0.0.0, 
Culture=neutral, PublicKeyToken=b77a5c561934e089]], mscorlib, ....

在内部,WinRT 将类型转换为:

System.Runtime.InteropServices.WindowsRuntime.CLRIKeyValuePairImpl<K, V>

如果您添加到您的 DataTemplate:

<TextBlock Text="{Binding}" Margin="5" />

你会看到它发出了上面的类型String, String

但是,由于某种原因,它没有按预期正确处理。如果您在 Internet 上搜索该类型,您会在 Connect 上看到该问题的记录错误

一个简单的解决方法是将您的数据放在一个不是 KeyValuePair 的简单对象中:

List<StringKeyValue> temp = new List<StringKeyValue>();
temp.Add(new StringKeyValue { Key = "key1", Value = "value1" } );
temp.Add(new StringKeyValue { Key = "key2", Value = "value2" });
temp.Add(new StringKeyValue { Key = "key3", Value = "value3" });
temp.Add(new StringKeyValue { Key = "key4", Value = "value4" });

this.DefaultViewModel["FooDictionary"] = temp;

public class StringKeyValue
{
    public string Key { get; set; }
    public string Value { get; set; }
}

顺便说一句,至少从一个简单的测试来看,导致问题的根本不是 Dictionary ,而是它是一个KeyValuePair正在转换为上述CLRIKeyValuePairImpl类型的对象实例。我尝试仅使用列表并将KeyValuePair<string, string>实例添加到列表中,但也失败了。

于 2012-11-11T16:23:36.580 回答
0

我想出了一个解决方法,它涉及动态生成您自己的键值对。

如果您有专门的字典,只需添加以下内容:

    public IEnumerable<MyPair<K, V>> Collection
    {
        get {
            foreach (var v in this)
            {
                MyPair<K, V> p = new MyPair<K, V>() { Key = v.Key, Value = v.Value };
                yield return p;
            }
         }
    }

并定义您的 Pair 类型:

public class MyPair<K, V>
{
    public K Key { get; set; }
    public V Value { get; set; }
}

另外,请注意每次都创建一个新对象。一些项目穿过对象,并存储返回,如果您尝试像我最初那样重用 MyPair,这可能导致一切看起来像最后一个项目。

于 2014-09-25T08:30:14.803 回答