2010-02-23 4 views
20

Псевдо пример:Создать словарь в 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

Более уточненный обсуждение на https://stackoverflow.com/ Вопросы/2494823/binding-dictionaryt-to-wpf-listbox – Ben

ответ

27

Вы не можете использовать Dictionary<TKey, TValue> класс непосредственно в XAML, потому что нет никакого способа, чтобы указать аргументы общего типа (это будет возможно в следующей версии XAML, но выиграл» t поддерживается в VS2010 дизайнере WPF ... по крайней мере, не в начальном выпуске).

Однако вы можете объявить не-общий класс, который наследуется от Dictionary<TKey, TValue>, и использовать его в XAML.

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

Что подразумевается под *, это будет возможно в следующей версии XAML * есть ли у вас какие-либо подсказки, когда они планируют ее реализовать? – Shimmy

+0

@Shimmy: на самом деле, он уже реализован в XAML 2009. К сожалению, VS2010 еще не поддерживает XAML 2009 :( –

+2

Подробнее см. Это видео: http://channel9.msdn.com/pdc2008/TL36/ (XAML 2009 новые функции представлены начиная с 7'20) –

5

В related question я дал answer, который показывает, как можно было бы создать общий словарь в XAML без особенностей в XAML 2009 с помощью пользовательского Markup Extension.

+0

Я проверил его. это замечательно! – Shimmy

+0

@Shimmy: Thanks :) –

6

Если ключи и значения являются строками, вы можете использовать ListDictionary или HybridDictionary.

Например:

<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

Объявление пространства имен: 'xmlns: Specialized =" clr-namespace: System.Collections.Specialized; assembly = System "' – Pollitzer

4

попробовать что-то вроде этого:

использовать это пространство имен: 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

Новый ответ на старое сообщение, но именно то, что мне нужно. – Pat