Можно ли сделать List <string> статическим ресурсом в xaml?
Если я хочу связать что-то вроде combobox в коде, у меня нет проблем вообще. Что-то вроде:
List<string> strings = new List<string>();
AddStringsFromDataSourceToList(strings);
comboBox1.ItemSource = strings;
Насколько я могу судить, в XAML нет быстрого и грязного способа сделать это. Для всей хвалы, которую wpf получает за ее сверхпростую привязку данных, что-то, что простое, намного проще сделать на С#. Есть ли более простой способ сделать это, чем создавать обертки DependencyProperty и добавлять их в качестве ресурсов без большой помощи от intellisense или всего, что входит в ObservableCollections? Я понимаю, что это не невозможно, но я должен что-то упустить, если такая простая задача кажется настолько глубокой...
EDIT: для пояснения добавление динамических списков - это проблема, а не статические массивы. Очень легко добавлять элементы вручную, как указывали многие.
Ответы
Ответ 1
Конечно, есть:
<ComboBox>
<ComboBoxItem>One</ComboBoxItem>
<ComboBoxItem>Two</ComboBoxItem>
</ComboBox>
Существуют и другие синтаксисы в зависимости от вашей цели, которые являются почти такими же просто - с использованием ресурсов или встроенных источников данных или сгруппированных данных.. даже XML-данных. Не расправляйте свои руки от разочарования, потому что первое, что вы пробовали, было нелегким - по моему мнению, wpf стоит кривой обучения.
WPF получает похвалу, потому что он делает разделение визуальных эффектов от поведения намного проще, чем формы Windows, и потому, что он делает создание приятных визуальных эффектов намного проще, а не потому, что упрощает выполнение простых примеров. Однако в этом случае проще сделать тривиальный пример.
С помощью вашего редактирования. Куда вы хотите их вытащить? Вам не нужно создавать свойства зависимостей или наблюдаемые коллекции любыми способами. Будет выполнено простое свойство списка (в этом случае я предпочитаю использовать sourceviewsource в xaml). Кроме того, не забывайте, что вам не нужно использовать все XAML, если вы ненавидите его. Но если вы разрабатываете WPF вместо этого, вы найдете множество задач (например, этот) легко.
Ответ 2
<Window.Resources>
<x:Array x:Key="strings" Type="sys:String"
xmlns:sys="clr-namespace:System;assembly=mscorlib">
<sys:String>One</sys:String>
<sys:String>Two</sys:String>
</x:Array>
<!-- likewise -->
<x:Array x:Key="persons" Type="{x:Type local:Person}"
xmlns:local="clr-namespace:namespace-where-person-is-defined">
<local:Person FirstName="Sarfaraz" LastName="Nawaz"/>
<local:Person FirstName="Prof" LastName="Plum"/>
</x:Array>
<Window.Resources>
<ComboBox ItemsSource="{StaticResource strings}" />
<ListBox ItemsSource="{StaticResource persons}">
<ListBox.ItemTemplate>
<DataTemplate>
<TextBlock>
<Run Text="{Binding FirstName}"/>
<Run Text=" "/>
<Run Text="{Binding LastName}"/>
</TextBlock>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
Ответ 3
Вы ищете что-то вроде этого:
<ComboBox>
<ComboBox.ItemsSource>
<x:Array Type="sys:String"
xmlns:sys="clr-namespace:System;assembly=mscorlib">
<sys:String>One</sys:String>
<sys:String>Two</sys:String>
</x:Array>
</ComboBox.ItemsSource>
</ComboBox>
Если вы хотите определить некоторые элементы для списка, посмотрите на решение от Henk Holterman. Кстати, вы можете объявить массив также как ресурс и для других типов.
Обновление
Кажется, вы изменили свой вопрос. Однако я не понимаю, каково ваше желание. Если вы хотите связать коллекцию, имеющуюся у вас в коде, затем создайте общедоступное свойство, которое возвращает эту коллекцию, установите DataContext для объекта, который предоставляет это свойство, и определите привязку в XAML:
<ComboBox ItemsSource="{Binding NameOfYourCollectionProperty}"...
Надеюсь, я правильно понял ваш вопрос...
Ответ 4
Вы можете сделать:
<ComboBox>
<ComboBoxItem>one</ComboBoxItem>
<ComboBoxItem>two</ComboBoxItem>
</ComboBox>
И существует также синтаксис для объявления (и неявного создания) данных, например, в разделе "Ресурс".
Может быть, вы можете указать более полный сценарий с требованиями и ограничениями?