Можно ли сделать List <string>статическим ресурсом в xaml? - PullRequest
12 голосов
/ 19 января 2011

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

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

comboBox1.ItemSource = strings;

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

РЕДАКТИРОВАТЬ: Чтобы уточнить, проблема заключается в добавлении динамических списков, а не статических массивов. Очень легко добавлять предметы вручную, как отмечали многие.

Ответы [ 4 ]

36 голосов
/ 19 января 2011
<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>
5 голосов
/ 19 января 2011

Вы ищете что-то вроде этого:

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

Если вы хотите определить только некоторые элементы для списка, посмотрите на решение от Хенка Холтермана.Кстати, вы можете объявить массив также как ресурс и для других типов.

Обновление

Похоже, вы изменили свой вопрос.Однако я не понимаю, каково ваше желание.Если вы хотите связать коллекцию, которая есть в вашем коде, создайте открытое свойство, которое возвращает эту коллекцию, задайте для DataContext объект, который предоставляет это свойство, и определите привязку в XAML:

<ComboBox ItemsSource="{Binding NameOfYourCollectionProperty}"...

Надеюсь, я правильно понял ваш вопрос ...

3 голосов
/ 19 января 2011

Конечно, есть:

<ComboBox>
    <ComboBoxItem>One</ComboBoxItem>
    <ComboBoxItem>Two</ComboBoxItem>
</ComboBox>

Существуют и другие синтаксисы, в зависимости от вашей цели, которые почти такие же простые - использование ресурсов или встроенных источников элементов или сгруппированных данных ... даже данных XML. Не расстраивай руки в отчаянии, потому что первое, что ты попробовал, было нелегко - по моему мнению, wpf стоит изучения.

WPF заслуживает похвалы, потому что он делает отделение визуальных элементов от поведения намного проще, чем формы Windows, и потому, что он делает создание приятных визуальных эффектов намного намного проще, а не потому, что упрощает создание тривиальных примеров. Однако в этом случае - проще сделать в тривиальном примере.

С вашей правкой Откуда вы хотите их вытащить? Вам не нужно создавать свойства зависимостей или наблюдаемые коллекции какими-либо способами. Подойдет простое свойство list (в этом случае я предпочитаю использовать collectionviewsource в xaml). Кроме того, не забывайте, что вам не нужно , чтобы использовать весь XAML, если вы его ненавидите. Но если вы разрабатываете для WPF, а не вопреки ему, вы найдете множество задач (таких как эта) несложными.

1 голос
/ 19 января 2011

Вы можете сделать:

    <ComboBox>
        <ComboBoxItem>one</ComboBoxItem>
        <ComboBoxItem>two</ComboBoxItem>
    </ComboBox>

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...