Создать словарь в xaml? - PullRequest
       36

Создать словарь в xaml?

21 голосов
/ 23 февраля 2010

Псевдо пример:

<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>

Ответы [ 4 ]

30 голосов
/ 23 февраля 2010

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

Однако вы можете объявить неуниверсальный класс, который наследуется от 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>
6 голосов
/ 24 июня 2013

Если ключи и значения являются строками, вы можете использовать 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>
5 голосов
/ 26 февраля 2012

В связанном вопросе я дал ответ , который показывает, как можно создать общий словарь в XAML без функций XAML 2009, используя пользовательское расширение разметки вместо этого.

4 голосов
/ 01 июля 2016

Попробуйте что-то вроде этого:

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