C# 将列表框绑定到静态列表并创建DataTemplate
我创建了以下具有静态成员列表的类:C# 将列表框绑定到静态列表并创建DataTemplate,c#,wpf,templates,data-binding,C#,Wpf,Templates,Data Binding,我创建了以下具有静态成员列表的类: public class Role { public static List<Role> AllRoles = new List<Role>() { Administrators, PowerUsers, Limited }; public static Role Administrators = new Role() { Name = "Bob" };
public class Role
{
public static List<Role> AllRoles = new List<Role>()
{
Administrators,
PowerUsers,
Limited
};
public static Role Administrators = new Role() { Name = "Bob" };
public static Role PowerUsers = new Role() { Name = "Jimbo" };
public static Role Limited = new Role() { Name = "Jack" };
public string Name { get; set; }
}
公共类角色
{
公共静态列表AllRoles=新列表()
{
管理员,
超级用户,
有限的
};
public static Role Administrators=new Role(){Name=“Bob”};
公共静态角色PowerUsers=newrole(){Name=“Jimbo”};
public static Role Limited=new Role(){Name=“Jack”};
公共字符串名称{get;set;}
}
现在,我正试图在一个列表框中绑定它,该列表框中有一个基于每个项目属性的项目模板。我无法使绑定工作,它不会返回值
<Window xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:WPFTests">
<Grid>
<ListBox Width="200" Height="200"
ItemsSource="{Binding Source={x:Static local:Role.AllRoles}}">
<ListBox.ItemTemplate>
<DataTemplate>
<CheckBox Content="{Binding Path=Name}" />
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
</Grid>
</Window>
我一定错过了一些简单的东西。我得到了3个复选框来表示一个由3个成员组成的数组,但是我没有得到任何绑定到公共属性的结果。如果您像这样重新排列代码,它会工作:
public class Role
{
public static List<Role> AllRoles = new List<Role>()
{
Administrators,
PowerUsers,
Limited
};
public static Role Administrators = new Role() { Name = "Bob" };
public static Role PowerUsers = new Role() { Name = "Jimbo" };
public static Role Limited = new Role() { Name = "Jack" };
public string Name { get; set; }
}
公共类角色
{
公共静态列表AllRoles=新列表()
{
管理员,
超级用户,
有限的
};
public static Role Administrators=new Role(){Name=“Bob”};
公共静态角色PowerUsers=newrole(){Name=“Jimbo”};
public static Role Limited=new Role(){Name=“Jack”};
公共字符串名称{get;set;}
}
您不应该依赖于静态字段初始化的特定顺序。根据,静态字段初始化的顺序未定义
使用静态构造函数可能会使代码更具可读性:
public class Role
{
public static Role Administrators;
public static Role PowerUsers;
public static Role Limited;
public static List<Role> AllRoles;
static Role()
{
Administrators = new Role() {Name = "Bob"};
PowerUsers = new Role() {Name = "Jimbo"};
Limited = new Role() {Name = "Jack"};
AllRoles = new List<Role>()
{
Administrators,
PowerUsers,
Limited
};
}
public string Name { get; set; }
}
公共类角色
{
公共静态角色管理员;
公共静态角色超级用户;
公共静态角色有限;
公共静态列表所有角色;
静态角色()
{
Administrators=新角色(){Name=“Bob”};
PowerUsers=newrole(){Name=“Jimbo”};
Limited=新角色(){Name=“Jack”};
AllRoles=新列表()
{
管理员,
超级用户,
有限的
};
}
公共字符串名称{get;set;}
}
在这里,我认为这是关于WPF绑定的一些我不知道的事情。我从未遇到过静态初始值设定项顺序的问题。很高兴知道。它不是未定义的,它们按照声明顺序执行。类的静态字段变量初始值设定项对应于按文本顺序执行的赋值序列,这些赋值在类声明中显示。@Sandeep Singh Rawat:根据上面的链接,初始化顺序未定义。此外,ECMA C#标准表示,它是未定义的(请参阅)。