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

Я имею поиск высоко и низко и не могу найти ответ на это. У меня есть два вопроса

  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>

Однако я не использовал бы список массива, я хотел бы использовать универсальный список поэтому, если кто-либо знает как сообщенный мне.

ОБНОВЛЕНИЕ РЕДАКТИРОВАНИЯ: Я предполагаю, что XAML имеет очень ограниченную поддержку дженериков поэтому, возможно, список массива является лучшим, я могу сделать на данный момент, но я все еще хотел бы справку по второму вопросу, если у кого-либо есть anser

2-й. Я попытался сослаться на объединенный словарь ресурса в своем XAML и имел проблемы, потому что под Window.resources у меня были больше, чем просто словарь, таким образом, он потребовал, чтобы я добавил x:Key. После того как я добавляю ключ, система больше не может находить объекты в моем словаре ресурса. Я должен был переместить объединенный словарь в Сетку. Ресурсы вместо этого. Идеально я хотел бы сослаться на объединенный словарь в app.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>

Спасибо

8
задан Chris Cap 19 March 2010 в 16:29
поделиться

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 (из любого 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>

Надеюсь, это поможет.
С уважением,
Михир Гокани

16
ответ дан 5 December 2019 в 09:25
поделиться

Для ресурсов вам просто нужно переместить дополнительный конвертер во вновь объявленный ResourceDictionary:

<App.Resources> 
    <ResourceDictionary> 
        <ResourceDictionary.MergedDictionaries> 
            <ResourceDictionary Source="/ResourcesD.xaml" /> 
        </ResourceDictionary.MergedDictionaries> 

    <win:BooleanToVisibilityConverter x:Key="VisibilityConverter" /> 
    </ResourceDictionary> 
</App.Resources> 
1
ответ дан 5 December 2019 в 09:25
поделиться

Пожалуйста, поправьте меня, если я ошибаюсь, но я думаю, вам нужно что-то вроде этого?

<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}"
1
ответ дан 5 December 2019 в 09:25
поделиться

Если вы добавите словарь ресурсов внутри ресурсов Window, вы не сможете получить к нему доступ везде, вместо этого вам следует добавить в ресурсы «App» (проверьте файл App.xaml).

<App.Resources> 
    <win:BooleanToVisibilityConverter x:Key="VisibilityConverter" /> 
    <ResourceDictionary> 
        <ResourceDictionary.MergedDictionaries> 
            <ResourceDictionary Source="/ResourcesD.xaml" /> 
        </ResourceDictionary.MergedDictionaries> 
    </ResourceDictionary> 
</App.Resources> 

Это будет доступно в каждом объекте WPF независимо от создания иерархии наследования.

0
ответ дан 5 December 2019 в 09:25
поделиться
Другие вопросы по тегам:

Похожие вопросы: