将集合或数组添加到wpf资源字典
我到处找,找不到答案。我有两个问题将集合或数组添加到wpf资源字典,wpf,resourcedictionary,Wpf,Resourcedictionary,我到处找,找不到答案。我有两个问题 如何在XAML中创建数组或集合。我有一个数组,我想粘在里面,绑定到一个组合框。我的第一个想法是将ItemsControl放在资源字典中,但组合框的ItemsSource需要IEnumerable,因此无法工作 这是我在我的资源字典中尝试过的,两种方法都不起作用 <ItemsControl x:Key="stateList"> <sys:String>AL</sys:String> <sys:String
<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>
艾尔
加利福尼亚州
CN
艾尔
加利福尼亚州
CN
下面是我如何与之结合的
<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>
艾尔
加利福尼亚州
CN
但是,我不希望使用数组列表,我希望使用通用列表,因此如果有人知道如何使用,请告诉我
编辑更新:我想XAML对泛型的支持非常有限,所以也许现在我能做的最好的方法是数组列表,但是如果有人有anser,我仍然希望在第二个问题上得到帮助
第二。我尝试在XAML中引用一个合并的资源字典,但遇到了问题,因为在Window.resources下,我不仅仅拥有字典,所以需要添加x:Key。一旦我添加了密钥,系统就无法再在我的资源字典中找到这些项。我不得不将合并字典移到Grid.Resources。理想情况下,我希望引用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>
谢谢如果我错了,请纠正我,但我想你想要这样的东西
<Grid.Resources>
<local:MyCustomCollection x:Key="local:MyCustomCollection"/>
</Brid.Resources>
在您的代码中,您将拥有:
MyCustomCollection custCol = MyGrid.Resources["MyCustomCollection"] as MyCustomCollection;
绑定将发生在具有如下属性的控件上:
ItemsSource="{StaticResource MyCustomCollection}"
<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}" />
<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>
若您在窗口的资源中添加了资源字典,那个么您将无法在任何地方访问它,而是应该添加“App”的资源(签出App.xaml文件)
这将在每个WPF对象中可用,无论创建任何继承层次结构。对于资源,您只需将额外的转换器移动到新声明的ResourceDictionary中:
<App.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="/ResourcesD.xaml" />
</ResourceDictionary.MergedDictionaries>
<win:BooleanToVisibilityConverter x:Key="VisibilityConverter" />
</ResourceDictionary>
</App.Resources>
据我所知,您希望将组合框(或列表框)与项目数组绑定,对吗?如果您想要从一些外部数据源中获取项目,可以使用handy DataContext属性。搜索MSDN以获取有关此的详细信息。但是,如果确实需要手动收集,请按以下方式进行: 创建自己的类:
public class StringCollection : ObservableCollection<string> { }
相反,你应该这样做:
ItemsSource="{StaticResource MyCustomCollection}"
<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}" />
<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>
希望这有帮助。问候,
米希尔·戈卡尼不太喜欢。我希望资源字典中有一个集合,因为我希望在多个控件和窗口之间共享该集合。这是一个州的名单。我希望能够绑定到州列表。我不想在后面的代码中访问它。好的,很抱歉,我现在不确定,我将把这个答案保留在这里,以防它对其他人有帮助。我确实尝试过,这正是我想要的,但是,它仍然抱怨需要一个资源密钥,当我添加资源密钥时,它不再解析。我认为您可以将转换器移动到ResourcesD.xaml中,然后您只能有一个资源字典元素。好吧,我在app.xaml中还有几个其他资源,我必须将它们全部移出。这似乎有点奇怪。我是否需要以某种方式用x:key引用绑定到它。不,我不认为你可以这样做,我认为最好的方法是,你可以有多个资源字典。。。您可以有一个“ConverterResources.xaml”和“CollectionResources.xaml”,并且您可以在资源字典中合并多个资源,但是这样做,您将能够在逻辑上分离所有资源并解决您的问题。这是有意义的。我试过了,效果不错。但是,它现在无法创建我在app.xaml中拥有的对象。没有给我任何有价值的调试信息。我做了一些改动,这样应用程序仍然可以工作。这是一种令人讨厌的解决方案,但资源正在解决。谢谢你这是一个有趣的方法。在我的例子中,它实际上不需要是可观察的,但我想它在我的例子中会起作用。关于解决提供资源密钥和解决方案失败的其他问题的任何想法OK,我已经为您的第二个问题添加了答案。这就是你要找的吗?哦!我认为我的第二个答案与@abe的答案很相似。非常感谢,这个解释真的很有道理,为什么将声明从app.xaml移动到另一个文件夹中的资源字典会抛出错误?我指定了所有正确的名称空间。