Wpf 为什么我不能在根控件的资源中放置一个对象数组?
假设我有一个普通的Xaml文件,其中有两个额外的XMLN,一个指向一个Person类,有两个CLR属性Name和Age,另一个指向一个String对象: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"
<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对象数组。这似乎是一个需要修复的优先级较低的已知资源。这似乎是一个需要修复的优先级较低的已知资源修理