将集合或数组添加到wpf资源字典

将集合或数组添加到wpf资源字典,wpf,resourcedictionary,Wpf,Resourcedictionary,我到处找,找不到答案。我有两个问题 如何在XAML中创建数组或集合。我有一个数组,我想粘在里面,绑定到一个组合框。我的第一个想法是将ItemsControl放在资源字典中,但组合框的ItemsSource需要IEnumerable,因此无法工作 这是我在我的资源字典中尝试过的,两种方法都不起作用 <ItemsControl x:Key="stateList"> <sys:String>AL</sys:String> <sys:String

我到处找,找不到答案。我有两个问题

  • 如何在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>
    
    
    艾尔
    加利福尼亚州
    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移动到另一个文件夹中的资源字典会抛出错误?我指定了所有正确的名称空间。