/ / Словник <String, String> не обов'язковий для xaml (Metro App) - .net, xaml, binding, windows-8, windows-runtime

Словник <String, String> не обов'язковий для xaml (Metro App) - .net, xaml, binding, windows-8, windows-runtime

У мене виникла проблема, пов'язана з роботою в DataTemplate ListView. Моя обов'язкова мета - KeyValuePair (я працюю з Metro App для Windows 8)

У мене є словник

Params = new Dictionary<string, string>();
Params.Add("Key1", "Value1");
Params.Add("Key1", "Value2");

Я намагаюся зв'язати це:

<ListView ItemsSource="{Binding Params}">
<ListView.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding Key}"></TextBlock>
<TextBlock Text="{Binding Value}"></TextBlock>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>

Але KeyPairValue не реагує на це (нічого не пов'язує). Але якщо я роблю це обов'язково:

<ListView ItemsSource="{Binding Params}">
<ListView.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding}"></TextBlock>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>

Я бачу: введіть скріншот xaml binding

Рано цей зв'язок працює правильно в додатку для Windows Phone 7. Що сталося в Windows 8?

Відповіді:

3 для відповіді № 1

Спробуйте вказати Path=:

<ListView ItemsSource="{Binding Path=Params}">
<ListView.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding Path=Key}"></TextBlock>
<TextBlock Text="{Binding Path=Value}"></TextBlock>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>

Але вам може знадобитися ObservableDictionary

Або ви можете просто виступити проти цієї помилки: http://social.msdn.microsoft.com/Forums/en-AU/winappswithcsharp/thread/234a17ad-975f-42f6-aa91-7212deda4190 який я знайшов через Googling clrIkeyvaluepairimpl


0 для відповіді № 2

Іншим рішенням є використання списку зі звичаємПара ключ / значення замість словника. Причина в тому, що IEnumerable> буде використовуватися для переліку пар ключ / значення, присутні в словнику під час зв'язування. Проблема з KeyValuPair, а не в словнику фактично, тому що вона перетворюється в System.Runtime.InteropServices.WindowsRuntime.CLRIKeyValuePairImpl, і є проблема при прив'язці до цього типу.

Тому створюємо клас, як:

public class XamlFriendlyKeyValuePair<Tkey, TValue>
{
public TKey Key {get; set;}
public TValue Value {get; set;}
}

І використовувати його, як це, має зробити фокус:

Params = new List<XamlFriendlyKeyValuePair<string, string>>();
Params.Add{"Key1", "Value1"};
Params.Add{"Key1", "Value2"};

Джерело: http://www.sohuaz.xyz/questions/683779/binding-a-dictionary-to-a-winrt-listbox