This article pretends to show a possible solution for a common problem when asp.net developers work with ListView: databind expression (<%# %>) in the LayoutTemplate does not work.
My English is not the best so all suggestions and fixes are welcome.
Sometime ago I had to face this problem, I google it and found a possible solution: extend ListView class and do the databind in the CreateLayoutTemplate. In my case was not the best solution because we had a lot of code done and change asp listview tag for the new custom listview tag was simply unacceptable.
I don’t want to extend me (because my english) but basically what I did was use Adapaters. I previously worked with css adapters so I used that code like a base. After some research I found that correct adapter for ListView is DataBoundControlAdapter ( in System.Web.UI.WebControls.Adapters namespace).
public class ListViewAdapter : DataBoundControlAdapter
The next that I had to decide was where and how to do the LayoutTemplate DataBind, the first (and the unique) option that I found was LayoutCreated event. Now, I had‘where’ but left how. Checking the ListView inside handler of LayoutCreated event I found that all databind expressions were removed, also I notice that Listview only had one control (the rendered LayoutTemplate) so the solution was instance in a temporal control the LayoutTemplate and then do the databind to it, after that, remove the current rendered layoutTemplate from listview and replace it by the new databound control.
void AdaptedControl_LayoutCreated(object sender, EventArgs e)
ListView lv = AdaptedControl;
Control template = new Control();
The last step was add the Broswer file to project and the custom adapter for the listview.
<adapter controlType="System.Web.UI.WebControls.ListView" adapterType="Adapters.ListViewAdapter" />
And that’s all. Now you can use databind expressions (<%# %>) inside LayoutTemplate (obviously no data from datasource).