Wpf 为什么我不能在根控件的资源中放置一个对象数组?

Wpf 为什么我不能在根控件的资源中放置一个对象数组?,wpf,arrays,xaml,instantiation,Wpf,Arrays,Xaml,Instantiation,假设我有一个普通的Xaml文件,其中有两个额外的XMLN,一个指向一个Person类,有两个CLR属性Name和Age,另一个指向一个String对象: <Window x:Class="WpfPractice.ListBinding" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

假设我有一个普通的Xaml文件,其中有两个额外的XMLN,一个指向一个Person类,有两个CLR属性Name和Age,另一个指向一个String对象:

<Window x:Class="WpfPractice.ListBinding"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="clr-namespace:WpfPractice"
    xmlns:sys="clr-namespace:System;assembly=mscorlib"        
    Title="ListBinding" Height="200" Width="600">
我可以在根窗口元素的资源集合中放置字符串数组:

    <Window.Resources>  
        <x:Array x:Key="ThisWorks" Type="{x:Type sys:String}">  
            <sys:String>John</sys:String>  
            <sys:String>Andy</sys:String>  
        </x:Array>  
    </Window.Resources>
我还可以在根控件的资源中实例化一个对象:

    <Window.Resources>  
        <local:Person x:Key="ThisAlsoWorks" Name="Michael" Age="40"/>  
    </Window.Resources>
但是,如果我在根控件的资源中实例化一个项目数组,VS将不允许我构建:

    <Window.Resources>  
        <x:Array x:Key="ThisWontBuild" Type="{x:Type local:Person}">  
            <local:Person Name="Michael" Age="40"/>  
            <local:Person Name="Jim" Age="30"/>   
        </x:Array>
    </Window.Resources>
如果我在子控件(如网格)的资源中实例化对象数组,那么Wver VS将如何构建:

    <Grid.Resources>  
        <x:Array x:Key="ThisWillBuild" Type="{x:Type local:Person}">  
            <local:Person Name="Michael" Age="40"/>  
            <local:Person Name="Jim" Age="30"/>   
        </x:Array>
    </Grid.Resources>

有人知道为什么吗?

也许您在根元素上缺少相应的xmln


我想不出它不起作用的任何其他原因,我可以告诉您,这当然是可能的,因为我经常这样做。

也许您在根元素上缺少相应的xmln


我想不出它不起作用的任何其他原因,我可以告诉你,这当然是可能的,因为我经常这样做。

使用sys而不是x作为数组的xmlns。希望这会有帮助。

使用sys而不是x作为数组的xmlns。希望这会有帮助。

正如我所说的,问题在于我的代码,但答案更大比我想象的还要奇怪。我的代码中还有一个类,它的唯一属性返回一个列表:

public class CreateList
{
    public CreateList()
    {
        _createdList.Add("carrot");
        _createdList.Add("fox");
        _createdList.Add("explorer");
    }

    List<string> _createdList = new List<string>();

    public List<string> CreatedList
    {
        get { return _createdList; }
    }
}
如果我有一个指向数组的资源,以及一个指向根窗口元素中CreateList类的资源,那么VS构建没有任何问题。因此,使用我在问题中描述的窗口根元素头,这是可行的:

<Window.Resources>
    <x:Array x:Key="Office" Type="{x:Type local:Person}">
        <local:Person Name="Michael" Age="40"/>
        <local:Person Name="Jim" Age="30"/>
        <local:Person Name="Dwight" Age="30"/>
    </x:Array>
    <local:CreateList x:Key="myCreateList"/>       
</Window.Resources>
但是,如果我首先将资源指向CreateList,VS不会生成

<Window.Resources>
    <local:CreateList x:Key="myCreateList"/>
    <x:Array x:Key="Office" Type="{x:Type local:Person}">
        <local:Person Name="Michael" Age="40"/>
        <local:Person Name="Jim" Age="30"/>
        <local:Person Name="Dwight" Age="30"/>
    </x:Array>
</Window.Resources>

如果我有一个字符串数组,但如果我使用单个字符串或Person对象,则会出现相同的问题。奇怪吧?所以我回答了我原来的问题,但现在我有一个新问题!典型。

正如我所说,问题在于我的代码,但答案比我想象的更奇怪。我的代码中还有一个类,它的唯一属性返回一个列表:

public class CreateList
{
    public CreateList()
    {
        _createdList.Add("carrot");
        _createdList.Add("fox");
        _createdList.Add("explorer");
    }

    List<string> _createdList = new List<string>();

    public List<string> CreatedList
    {
        get { return _createdList; }
    }
}
如果我有一个指向数组的资源,以及一个指向根窗口元素中CreateList类的资源,那么VS构建没有任何问题。因此,使用我在问题中描述的窗口根元素头,这是可行的:

<Window.Resources>
    <x:Array x:Key="Office" Type="{x:Type local:Person}">
        <local:Person Name="Michael" Age="40"/>
        <local:Person Name="Jim" Age="30"/>
        <local:Person Name="Dwight" Age="30"/>
    </x:Array>
    <local:CreateList x:Key="myCreateList"/>       
</Window.Resources>
但是,如果我首先将资源指向CreateList,VS不会生成

<Window.Resources>
    <local:CreateList x:Key="myCreateList"/>
    <x:Array x:Key="Office" Type="{x:Type local:Person}">
        <local:Person Name="Michael" Age="40"/>
        <local:Person Name="Jim" Age="30"/>
        <local:Person Name="Dwight" Age="30"/>
    </x:Array>
</Window.Resources>

如果我有一个字符串数组,但如果我使用单个字符串或Person对象,则会出现相同的问题。奇怪吧?所以我回答了我原来的问题,但现在我有一个新问题!典型。

我似乎也有类似的问题。如果x:Array在我的UserControl上声明为资源,则我得到了编译器错误。我发现我能够将x:Array的声明移动到UserControl内的DockPanel上,然后一切正常。

我似乎也遇到了类似的问题。如果x:Array在我的UserControl上声明为资源,则我得到了编译器错误。我发现我能够将x:Array的声明移动到UserControl中的DockPanel上,然后一切都正常了。

您必须创建Person类

namespace WpfPractice
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }
    }
    public class Person
    {
        public string Name { get; set; }
        public int Age { get; set; }
    }
}
参考文献
您必须创建Person类

namespace WpfPractice
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }
    }
    public class Person
    {
        public string Name { get; set; }
        public int Age { get; set; }
    }
}
参考文献

您收到了什么错误消息?该类无法初始化:名称“InitializeComponent”在当前上下文中不存在您收到了什么错误消息?该类无法初始化:名称“InitializeComponent”在当前上下文中不存在我不会对Xaml文件做任何更改,只更改数组的位置,如果我把数组放在网格中,而不是根元素中,它就可以工作。真奇怪!这两个元素之间肯定有一些区别,我从来没有遇到过这样的问题。他是对的;我的代码有问题。我在根窗口元素的ResourceCollection中有另一个与代码交互的资源:如果我删除此资源,我就可以在根窗口资源集合中实例化Person对象数组。我不更改Xaml文件的任何内容,只更改数组的位置,如果我把数组放在网格中,而不是根元素中,它就可以工作。真奇怪!这两个元素之间肯定有一些区别,我从来没有遇到过这样的问题。他是对的;我的代码有问题。我在根窗口元素的ResourceCollection中有另一个与代码冲突的资源:如果我删除这个资源,我就可以在根窗口资源集合中实例化一个Person对象数组。这似乎是一个需要修复的优先级较低的已知资源。这似乎是一个需要修复的优先级较低的已知资源修理