Подтвердить что ты не робот

Можно ли сделать List <string> статическим ресурсом в xaml?

Если я хочу связать что-то вроде combobox в коде, у меня нет проблем вообще. Что-то вроде:

List<string> strings = new List<string>();
AddStringsFromDataSourceToList(strings);

comboBox1.ItemSource = strings;

Насколько я могу судить, в XAML нет быстрого и грязного способа сделать это. Для всей хвалы, которую wpf получает за ее сверхпростую привязку данных, что-то, что простое, намного проще сделать на С#. Есть ли более простой способ сделать это, чем создавать обертки DependencyProperty и добавлять их в качестве ресурсов без большой помощи от intellisense или всего, что входит в ObservableCollections? Я понимаю, что это не невозможно, но я должен что-то упустить, если такая простая задача кажется настолько глубокой...

EDIT: для пояснения добавление динамических списков - это проблема, а не статические массивы. Очень легко добавлять элементы вручную, как указывали многие.

4b9b3361

Ответ 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>

И существует также синтаксис для объявления (и неявного создания) данных, например, в разделе "Ресурс".

Может быть, вы можете указать более полный сценарий с требованиями и ограничениями?