Добавление коллекции или массива в словарь ресурсов wpf
Я искал повсюду и не могу найти ответа на этот вопрос. У меня два вопроса!--6-->
- как создать массив или коллекцию в XAML. У меня есть массив, который я хочу вставить туда и привязать к поле со списком. Моей первой идеей было поместить ItemsControl в словарь ресурсов, но ItemsSource поля со списком ожидает IEnumerable, так что это не сработало.
вот что я пробовал в своем словаре ресурсов, и ни один работает
<ItemsControl x:Key="stateList">
<sys:String>AL</sys:String>
<sys:String>CA</sys:String>
<sys:String>CN</sys:String>
</ItemsControl>
<ItemsControl x:Key="stateList2">
<ComboBoxItem>AL</ComboBoxItem>
<ComboBoxItem>CA</ComboBoxItem>
<ComboBoxItem>CN</ComboBoxItem>
</ItemsControl>
и вот как я привязываюсь к нему
<ComboBox SelectedValue="{Binding Path=State}" ItemsSource="{Binding Source={StaticResource stateList2}}" >
</ComboBox>
ИЗМЕНИТЬ: ОБНОВЛЕНО
я получил эту первую часть работы таким образом
<col:ArrayList x:Key="stateList3">
<sys:String>AL</sys:String>
<sys:String>CA</sys:String>
<sys:String>CN</sys:String>
</col:ArrayList>
однако я бы предпочел не использовать список массивов, я хотел бы использовать общий список, поэтому, если кто-нибудь знает, как, Пожалуйста, дайте мне знать.
EDIT UPDATE: я думаю, XAML имеет очень ограниченную поддержку дженериков, поэтому, возможно, список массивов-лучшее, что я могу сделать сейчас, но я все равно хотел бы помочь по второму вопросу, если кто-нибудь имеет anser
2-й. Я попытался ссылаться на Объединенный словарь ресурсов в моем XAML и имел проблемы, потому что под окном.ресурсы у меня было больше, чем просто словарь, поэтому мне пришлось добавить x: Key. Как только я добавляю ключ, система больше не может найти элементы в моем словаре ресурсов. Мне пришлось переместить объединенный словарь в Grid.Вместо этого ресурсы. В идеале я хотел бы ссылаться на Объединенный словарь в приложении.xaml, но у меня та же проблема
вот пример кода. Эта первая часть требовала x: key для компиляции, потому что у меня есть конвертер, и он жаловался, что каждый элемент должен иметь ключ, если есть более одного
<UserControl.Resources>
<win:BooleanToVisibilityConverter x:Key="VisibilityConverter" />
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="/ResourcesD.xaml" />
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</UserControl.Resources>
Я должен был изменить его на это
<UI:BaseStep.Resources>
<win:BooleanToVisibilityConverter x:Key="VisibilityConverter" />
</UI:BaseStep.Resources>
<Grid>
<Grid.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="/ResourcesD.xaml" />
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</Grid.Resources>
</Grid>
спасибо
4 ответов
насколько я понимаю вашу проблему, вы хотите связать ComboBox (или ListBox) с массивом элементов, верно? Если вам нужны элементы из какого-либо внешнего источника данных, вы можете просто использовать удобное свойство DataContext. Поиск MSDN для больше на этом. Однако, если вам нужна ручная коллекция, сделайте это следующим образом:
создайте свой собственный класс:
public class StringCollection : ObservableCollection<string> { }
и теперь используйте его так:
<Window.Resources>
<local:StringCollection x:Key="stringCollection">
<sys:String>Hello</sys:String>
<sys:String>World</sys:String>
</local:stringCollection>
</Window.Resources>
...
<ListBox
Margin="15"
ItemsSource="{StaticResource stringCollection}" />
или, если вы хотите более общую коллекцию, создайте класс вот так:
public class ObjectCollection : ObservableCollection<object> { }
и используйте его так:
<local:ObjectCollection x:Key="objectCollection">
<sys:String>Hello</sys:String>
<TextBlock>World</TextBlock>
<sys:Int32>12345</sys:Int32>
</local:ObjectCollection>
...
<ComboBox
Margin="15"
ItemsSource="{StaticResource objectCollection}" />
Вы также можете использовать некоторые встроенные классы, такие как Int32Collection
что реализует IEnumerable
. Вы можете использовать их непосредственно в качестве ресурса.
на Resources
свойство (of любой FrameworkElement
как Window
, UserControl
или Application
) имеет тип ResourceDictionary
не коллекция словарей ресурсов! так вы не могу делаю так:
<UserControl.Resources>
<!-- The first RD -->
<!--<ResourceDictionary>
<win:BooleanToVisibilityConverter x:Key="VisibilityConverter" />
</ResourceDictionary>-->
<!-- Second RD!!! -->
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="/ResourcesD.xaml" />
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</UserControl.Resources>
вместо этого сделайте так:
<UserControl.Resources>
<!--
There should be only 1 main RD,
Merge other RDs, if any
-->
<ResourceDictionary>
<!-- First Resource -->
<win:BooleanToVisibilityConverter x:Key="VisibilityConverter" />
<!-- Second Resource -->
<ResourceDictionary.MergedDictionaries>
<!-- Now, there can be multiple RDs -->
<ResourceDictionary Source="/ResourcesA.xaml" />
<ResourceDictionary Source="/ResourcesB.xaml" />
<ResourceDictionary Source="/ResourcesC.xaml" />
<ResourceDictionary Source="/ResourcesD.xaml" />
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</UserControl.Resources>
надеюсь, что это помогает.
С уважением,
Gokani Mihir
пожалуйста, поправьте меня, если я ошибаюсь, но я думаю, что вы хотите что-то подобное?
<Grid.Resources>
<local:MyCustomCollection x:Key="local:MyCustomCollection"/>
</Brid.Resources>
в верхней части окна у вас будет свойство:
xmlns:local="clr-namespace:MyNamespace"
и внутри вашего кода у вас будет:
MyCustomCollection custCol = MyGrid.Resources["MyCustomCollection"] as MyCustomCollection;
привязка произойдет на элементе управления со свойством примерно так:
ItemsSource="{StaticResource MyCustomCollection}"
для ресурсов вам просто нужно переместить дополнительный конвертер во вновь объявленный ResourceDictionary:
<App.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="/ResourcesD.xaml" />
</ResourceDictionary.MergedDictionaries>
<win:BooleanToVisibilityConverter x:Key="VisibilityConverter" />
</ResourceDictionary>
</App.Resources>
Если вы добавляете словарь ресурсов внутри ресурсов окна, вы не сможете получить к нему доступ везде, вместо этого вы должны добавить ресурсы "приложения" (проверьте приложение.файл XAML.)
<App.Resources>
<win:BooleanToVisibilityConverter x:Key="VisibilityConverter" />
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="/ResourcesD.xaml" />
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</App.Resources>
Это будет доступно в каждом объекте WPF независимо от создания иерархии наследования.