Вопрос по windows-runtime – Привязка словаря к списку WinRT

4

Я прочитал несколько сообщений о привязке словаря к WPF ListView и ListBox, но я не могуполучить эквивалентный код для работы в WinRT.


        
            
                
                    
                        
                            
                            
                        
                    
                
            
        
    


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

Что такое правильное связывание?

Ваш Ответ

2   ответа
0

Мы придумали обходной путь, который включает в себя динамическое создание ваших собственных пар Key Value.

Если ты'V специализированный словарь, просто добавьте это:

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

и определите тип вашей пары:

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

Также будьте осторожны, чтобы каждый раз создавать новый объект. Некоторые элементы проходят через объект и сохраняют возврат, что может привести к тому, что все будет выглядеть как последний элемент, если вы попытаетесь использовать MyPair повторно, как я делал изначально.

7

Ошибка в окне вывода (обрезана до наиболее полезной части):

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

Если вы добавите в свой DataTemplate:


Вы'посмотрим, что он испускает вышеупомянутый тип с.String, String

Однако по какой-то причине этоне обрабатывается должным образом, как ожидалось. Если вы ищете этот тип в Интернете, вы 'посмотрим что тамсзадокументированная ошибка для вопроса о подключении.

Простой обходной путь - поместить ваши данные в простой объект, который не является KeyValuePair:

List temp = new List();
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; }
}

Помимо простого теста, по крайней мере,это не словарь, которыйвызывает проблему вообще, этотот факт, что этосKeyValuePair экземпляр объекта, который 'превращается вCLRIKeyValuePairImpl типа, упомянутого выше. Я пытался просто использовать список и добавитьKeyValuePair экземпляр в список, и это тоже не удалось.

Я тоже был удивлен! Я признаю, однако, что у меня неткогда-либо было необходимо добавить KVP непосредственно к привязке пользовательского интерфейса в WPF, Silverlight или XAMLт только для тестирования. К счастью, этопростой обходной путь. :)Я' WiredPrairie
Спасибо! Это неМне не приходит в голову, что во время выполнения будет такая очевидная ошибка. Я ценю быстрый ответ. Bill Shihara

Похожие вопросы