2010-02-23 10 views
20

Pseudo Beispiel:Erstellen Sie ein Wörterbuch in XAML?

<Window> 
    <Window.Tag> 
    <x:Dictionary KeyType="{x:Type sys:String}" ValueType="{x:Type sys:Int32}"> 
     <sys:DictionaryEntry Entry="{sys:DictionaryEntry Key0, 000}"/> 
     <sys:DictionaryEntry Key="key1" Value="111"/> 
     <sys:DictionaryEntry> 
      <sys:DictionaryEntry.Key> 
      <sys:String>Key2<sys:String> 
      </sys:DictionaryEntry.Key>   
      <sys:DictionaryEntry.Value> 
      <sys:Int32>222</sys:Int32>    
      </sys:DictionaryEntry.Value> 
     </sys:DictionaryEntry> 
    </x:Dictionary />  
    </Window.Tag> 
</Window> 
+0

mehr up-to-date Diskussion bei https://stackoverflow.com/ Fragen/2494823/binding-dictionaryt-to-a-wpf-listbox – Ben

Antwort

27

Sie können nicht die Dictionary<TKey, TValue> Klasse direkt in XAML verwenden, weil es keine Möglichkeit gibt, die generischen Typargumente angeben (es in der nächsten Version von XAML möglich sein wird, aber es gewann‘ t in VS2010 WPF-Designer unterstützt werden ... zumindest nicht in der ersten Version).

Sie können jedoch eine nicht generische Klasse deklarieren, die von Dictionary<TKey, TValue> erbt, und sie in XAML verwenden.

C#

public class MyDictionary : Dictionary<string, int> { } 

XAML

<Window> 
    <Window.Tag> 
    <local:MyDictionary> 
     <sys:Int32 x:Key="key0">0</sys:Int32> 
     <sys:Int32 x:Key="key1">111</sys:Int32> 
     <sys:Int32 x:Key="key2">222</sys:Int32> 
    </local:MyDictionary />  
    </Window.Tag> 
</Window> 
+0

Was ist gemeint mit * wird es in der nächsten Version von XAML * möglich sein, haben Sie irgendwelche Ahnung, wenn sie es implementieren wollen? – Shimmy

+0

@Shimmy: eigentlich ist es bereits in XAML 2009 implementiert. Leider unterstützt VS2010 noch nicht XAML 2009 :( –

+2

Für Details, siehe dieses Video: http://channel9.msdn.com/pdc2008/TL36/ (XAML 2009 Neue Funktionen werden ab 7'20 gezeigt) –

5

In einem related question i gab einen answer die zeigt, wie man ein allgemeines Wörterbuch in XAML ohne die XAML 2009-Funktionen mithilfe eines benutzerdefinierten schaffen könnte Markup Extension stattdessen.

+0

habe ich es überprüft – Shimmy

+0

@Shimmy: Danke :) –

6

Wenn die Schlüssel und Werte Strings sind, können Sie ListDictionary oder HybridDictionary verwenden.

Zum Beispiel:

<Specialized:ListDictionary x:Key="MasterSlidesFileNames"> 
    <System:String x:Key="long">Ya long yes ni</System:String> 
    <System:String x:Key="Sun">Waterfall</System:String> 
    <System:String x:Key="lorem ipsum">hello wOrld</System:String> 
</Specialized:ListDictionary> 
+1

Namensraum Deklaration: 'xmlns: Specialized =" clr-namespace: System.Collections.Specialized; assembly = System "' – Pollitzer

4

Probieren Sie etwas wie folgt aus:

Verwendung dieser Namespace: xmlns:collections="clr-namespace:System.Collections;assembly=mscorlib"

<ComboBox.ItemsSource> 
    <collections:ArrayList> 
     <collections:DictionaryEntry Key="0" Value="Standby"/> 
     <collections:DictionaryEntry Key="1" Value="Maintenance"/> 
     <collections:DictionaryEntry Key="2" Value="Available"/> 
     <collections:DictionaryEntry Key="3" Value="Deselected"/> 
     <collections:DictionaryEntry Key="4" Value="Input Error"/> 
    </collections:ArrayList> 
</ComboBox.ItemsSource> 
+0

Neue Antwort auf einen alten Beitrag, aber genau das, was ich brauchte. – Pat