Mam problem z wiązaniem pracującym w DataTemplate z ListView. Moim wiążącym celem jest KeyValuePair. (Pracuję z aplikacją Metro dla Windows 8)
Mam słownik
Params = new Dictionary<string, string>();
Params.Add("Key1", "Value1");
Params.Add("Key1", "Value2");
Próbuję powiązać:
<ListView ItemsSource="{Binding Params}">
<ListView.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding Key}"></TextBlock>
<TextBlock Text="{Binding Value}"></TextBlock>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
Ale KeyPairValue nie reaguje na to (nic nie wiąże). Ale jeśli zrobię to wiążące:
<ListView ItemsSource="{Binding Params}">
<ListView.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding}"></TextBlock>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
Widzę:
Wczesne powiązanie działa poprawnie w aplikacji dla systemu Windows Phone 7. Co się stało w systemie Windows 8?
Odpowiedzi:
3 dla odpowiedzi № 1Spróbuj określić 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>
Ale możesz potrzebować ObservableDictionary
Lub możesz po prostu walczyć z tym błędem: http://social.msdn.microsoft.com/Forums/en-AU/winappswithcsharp/thread/234a17ad-975f-42f6-aa91-7212deda4190 które znalazłem przez googlowanie clrIkeyvaluepairimpl
0 dla odpowiedzi nr 2
Innym rozwiązaniem jest użycie Listy z niestandardowymPara klucz / wartość zamiast słownika. Powodem jest to, że IEnumerable> będzie używane do wyświetlania par Key / Value obecnych w słowniku podczas bindowania. Problem dotyczy KeyValuPair, a nie samego słownika, ponieważ jest konwertowany do System.Runtime.InteropServices.WindowsRuntime.CLRIKeyValuePairImpl i pojawia się problem podczas wiązania z tym typem.
Więc tworząc klasę jak:
public class XamlFriendlyKeyValuePair<Tkey, TValue>
{
public TKey Key {get; set;}
public TValue Value {get; set;}
}
I używanie go w ten sposób powinno zrobić trik:
Params = new List<XamlFriendlyKeyValuePair<string, string>>();
Params.Add{"Key1", "Value1"};
Params.Add{"Key1", "Value2"};
Źródło: http://www.sohuaz.xyz/questions/683779/binding-a-dictionary-to-a-winrt-listbox