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

时间:2010-03-19 16:01:57

标签: wpf resourcedictionary

我搜索高低,无法找到答案。我有两个问题

  1. 如何在XAML中创建数组或集合。我有一个数组,我想坚持在那里并绑定到一个组合框。我的第一个想法是将ItemsControl放在资源字典中,但组合框的ItemsSource需要IEnumerable,因此无效。
  2. 这是我在资源字典中尝试的内容,但无法正常工作

    <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

    第二。我尝试在我的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>
    

    谢谢

4 个答案:

答案 0 :(得分:15)

据我了解你的问题,你想用一个项目数组绑定一个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的{​​{1}}。您可以直接将它们用作资源。


IEnumerable属性( 任何 Resources,如FrameworkElementWindow或{{1} })类型UserControl不是资源字典的集合!所以你 不能 这样做:

Application

相反,请执行以下操作:

ResourceDictionary

希望这有帮助。
问候,
Mihir Gokani

答案 1 :(得分:1)

如果我错了,请纠正我,但我想你想要这样的事情?

<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}"

答案 2 :(得分:1)

对于资源,您只需将附加转换器移动到新声明的ResourceDictionary:

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

    <win:BooleanToVisibilityConverter x:Key="VisibilityConverter" /> 
    </ResourceDictionary> 
</App.Resources> 

答案 3 :(得分:0)

如果你在Window的资源中添加资源字典,你将无法在任何地方访问它,而是应该添加“App”的资源(查看App.xaml文件)。

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

无论是否创建任何继承层次结构,都可以在每个WPF对象中使用它。