将列表框绑定到静态列表并创建数据模板

本文关键字:列表 创建 数据 静态 绑定 | 更新日期: 2023-09-27 18:36:13

我用静态成员列表创建了以下类:

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

现在,我尝试在ListBox中使用基于每个属性的项模板绑定到它。 我无法使绑定工作,它不返回值。

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

不应依赖于静态字段初始化的特定顺序。根据 http://msdn.microsoft.com/en-us/library/aa645758(v=vs.71).aspx,静态字段初始化的顺序是不确定的。

使用静态构造函数,代码可能更具可读性:

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