У мене виникла проблема, пов'язана з роботою в 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>
Я бачу:
Рано цей зв'язок працює правильно в додатку для 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