【问题标题】:Binding a ListBox to a static list and creating a DataTemplate将 ListBox 绑定到静态列表并创建 DataTemplate
【发布时间】:2012-06-02 03:44:47
【问题描述】:

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

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 个成员组成的数组,但我没有得到任何绑定到公共属性的结果。

【问题讨论】:

    标签: c# wpf templates data-binding


    【解决方案1】:

    如果你像这样重新排列你的代码,它会起作用:

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

    【讨论】:

    • 在这里我认为这是我不知道的关于 WPF 绑定的事情。我从来没有遇到过静态初始化器顺序的问题。很高兴知道。
    • 它不是未定义的,它们按照声明顺序执行。类的静态字段变量初始化器对应于一系列赋值,它们按照它们在类声明中出现的文本顺序执行。
    • @Sandeep Singh Rawat:根据上面的链接,初始化顺序是未定义的。此外,ECMA C# 标准说它是未定义的(参见ecma-international.org/publications/files/ECMA-ST/Ecma-334.pdf)。
    猜你喜欢
    • 2010-11-13
    • 2011-12-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多