увы, MultiView не подходит.. по причине того, что биндинг идет по всем View сразу, соответственно, если в каком-либо классе нет свойства указанного в биндинге, получаем DataBinding: 'ClassName' does not contain a property with the name 'PropertyName'.
смоделировать можно на этом примере<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Test.aspx.cs" Inherits="Test" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title>Untitled Page</title>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:ListView ID="ListView1" runat="server" ItemPlaceholderID="itemPlaceholder" OnItemCreated="ListView_ItemCreated">
<LayoutTemplate>
<asp:PlaceHolder ID="itemPlaceholder" runat="server"></asp:PlaceHolder>
</LayoutTemplate>
<ItemTemplate>
<asp:MultiView ID="MultiView1" ActiveViewIndex="0" runat="server">
<asp:View ID="FooView" runat="server">
<h1>FOO template</h1>
<div><%# Eval("Name") %></div>
<p> </p>
</asp:View>
<asp:View ID="BarView" runat="server">
<h1>BAR template</h1>
<div><%# Eval("Name") %></div>
<div><%# Eval("Description") %></div>
<p> </p>
</asp:View>
</asp:MultiView>
</ItemTemplate>
</asp:ListView>
</div>
</form>
</body>
</html>
using System;
using System.Collections;
using System.Collections.Generic;
using System.Configuration;
using System.Data;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Linq;
public partial class Test : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
BindData();
}
}
private void BindData()
{
ListView1.DataSource = GetList();
ListView1.DataBind();
}
internal void ListView_ItemCreated(object sender, ListViewItemEventArgs e)
{
ListViewDataItem dataItem = (ListViewDataItem)e.Item;
MultiView multiView = (MultiView)e.Item.FindControl("MultiView1");
if (dataItem.DataItem is Bar)
multiView.SetActiveView((View)e.Item.FindControl("BarView"));
else
multiView.SetActiveView((View)e.Item.FindControl("FooView"));
}
private IEnumerable<Foo> GetList()
{
yield return new Foo();
yield return new Bar();
}
class Foo
{
public string Name { get { return GetType().ToString(); } }
}
class Bar : Foo
{
public string Description { get { return "description"; } }
}
}
обойти можно, например ввести в иерархию классов дополнительное свойство
class Foo
{
public virtual string Code { get { return "FOO"; } }
public string Name { get { return GetType().ToString(); } }
}
class Bar : Foo
{
public override string Code { get { return "BAR"; } }
public string Description { get { return "description"; } }
}
и биндить опираясь на него
<div><%# Eval("Code") == "BAR" ? Eval("Description") : "" %></div>
но не нравится мне такое решение..
в общем склоняюсь к тому что ListView мне не подходит..
буду пробовать вариант SobakaWWW
или есть еще приемлемые варианты?
Данное сообщение получено с сайта GotDotNet.RU
|