Я имею поиск высоко и низко и не могу найти ответ на это. У меня есть два вопроса
Вот то, что я попробовал в своем словаре ресурса и никаком работы
<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>
Спасибо
Насколько я понимаю вашу проблему, вы хотите связать 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>
Надеюсь, это поможет.
С уважением,
Михир Гокани
Для ресурсов вам просто нужно переместить дополнительный конвертер во вновь объявленный ResourceDictionary:
<App.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="/ResourcesD.xaml" />
</ResourceDictionary.MergedDictionaries>
<win:BooleanToVisibilityConverter x:Key="VisibilityConverter" />
</ResourceDictionary>
</App.Resources>
Пожалуйста, поправьте меня, если я ошибаюсь, но я думаю, вам нужно что-то вроде этого?
<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}"
Если вы добавите словарь ресурсов внутри ресурсов Window, вы не сможете получить к нему доступ везде, вместо этого вам следует добавить в ресурсы «App» (проверьте файл App.xaml).
<App.Resources>
<win:BooleanToVisibilityConverter x:Key="VisibilityConverter" />
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="/ResourcesD.xaml" />
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</App.Resources>
Это будет доступно в каждом объекте WPF независимо от создания иерархии наследования.