Добавление коллекции или массива в словарь ресурсов wpf

Я искал повсюду и не могу найти ответа на этот вопрос. У меня два вопроса!--6-->

  1. как создать массив или коллекцию в 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 независимо от создания иерархии наследования.