0

メンバーの静的リストを使用して次のクラスを作成しました。

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

今、私はそれぞれのプロパティに基づいたアイテムテンプレートを使用してリストボックスでそれにバインドしようとしています。バインディングを機能させることができません。値が返されません。

<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つのチェックボックスを取得していますが、パブリックプロパティにバインドするための結果が得られません。

4

1 に答える 1

2

このようにコードを再配置すると、次のように機能します。

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; }
}
于 2012-06-01T19:34:35.937 に答える