3

私は2つのクラスを作成しました-この質問の例のみ:

public class Item
{
    public int itemId { get; set; }
    public string name { get; set; }

    public Item() { }

    public Item(int itemId, string name) 
    {
        this.itemId = itemId;
        this.name = name;
    }
}

public class GroupOfitems
{
    public string groupName { get; set; }
    public List<Item> itemList;

    public GroupOfitems()
    {
        itemList = new List<Item>();
    }

    public GroupOfitems(string groupName, List<Item> itemList)
    {
        this.groupName = groupName;
        this.itemList = itemList;
    }
}

public List<GroupOfitems> TestMethod()
{
    // ADD SOME ITEMS TO FRUIT GROUP
    List<Item> bla = new List<Item>();
    bla.Add(new Item(1, "Banana"));
    bla.Add(new Item(2, "Apple"));

    // ADD SOME ITEMS TO VEGETABLES GROUP
    List<Item> bla2 = new List<Item>();
    bla2.Add(new Item(5, "Carot"));
    bla2.Add(new Item(6, "Tomato"));

    // ADD SOME ITEMS TO SOURCE
    List<GroupOfitems> result = new List<GroupOfitems>();
    result.Add(new GroupOfitems("Fruit", bla));
    result.Add(new GroupOfitems("Vegetables", bla2));

    // RETURN SOURCE
    return result;  
}

そして、私の .aspx ファイルには、次のものがObjectDataSourceありますListView

<asp:ObjectDataSource ID="odsRecipesIngredientListTest" runat="server"
    SelectMethod="TestMethod" TypeName="MyRepository">            
</asp:ObjectDataSource>

<asp:ListView ID="lvRecipeIngredients" runat="server" 
    DataSourceID="odsRecipesIngredientListTest" 
    ItemPlaceholderID="itemPlaceHolderId">
    <LayoutTemplate>
        <asp:PlaceHolder id="itemPlaceHolderId" runat="server" />
    </LayoutTemplate>
    <ItemTemplate>
        <asp:Label ID="lblGroupName" Text='<%# Eval("groupName") %>' runat="server" /><br />

        <asp:ListView ID="lvIngredientList" runat="server" 
            DataSource='<%# Eval("itemList") %>' 
            ItemPlaceholderID="itemPlaceHolderId">
            <LayoutTemplate>
                <asp:PlaceHolder id="itemPlaceHolderId" runat="server" />
            </LayoutTemplate>
            <ItemTemplate>
                <asp:Label ID="Label4" Text='<%# Eval("itemId") %>' runat="server" />
                <asp:Label ID="Label16" Text='<%# Eval("name") %>' runat="server" />
            </ItemTemplate>
        </asp:ListView>
    </ItemTemplate>
</asp:ListView>

これは、この質問の非常に簡単な例です。すべてが正常に機能しますが、 ( )のようにネストされたitemListようにバインドすることはできません(はクラスのプロパティではないため)。これはバインディングの正しいアプローチですか、それともアプローチを変更する必要がありますか?DataSourceListViewDataSource='<%# Eval("itemList") %>'itemList

4

1 に答える 1

2

メンバーは、propertyではなくfieldlistItemsとして定義されているため、リフレクションがそれを使用して見つけることができません(つまり、データ バインディングが実際に行うこと)。GetProperties

public class GroupOfitems
{
    public string groupName { get; private set; }

    public List<Item> ItemList { get; private set; }

    public GroupOfitems()
    {
        this.ItemList = new List<Item>();
    }

    public GroupOfitems(string groupName, List<Item> itemList)
    {
        this.groupName = groupName;
        this.ItemList = itemList;
    }
}

実際、データ インターフェイスを公開するには常にプロパティを使用する必要があります。それがカプセル化の意味です。

于 2013-04-11T11:14:16.840 に答える