itemtemplate(什么是itemtemplate)
一、WPF怎么从后台页面替换前台页面的控件模板(ItemTemplate)
看得出你的意思,你使用了mvvm模式,然后希望在viewmodel内部切换前端的DataTemplate。因为viewmodel理论上是不引用前端的,所以你肯定无法访问前端任何一个DataTemplate。所以你可以这样做:
把你需要在ViewModel中切换的DataTemplate切换到程序的资源字典中,资源字典也就是wpf的ResourceDictionary,你的ViewModel是可以访问到的。
在ViewModel中设置一个String类型的属性,例如SelectedTemplate,用于之后的模板切换。
在你前端的ItemTemplate位置绑定这个SelectedTemplate属性,但你需要一个Converter来辅助样式的切换。
<ListBox ItemTemplate="{Binding Path=SelectedTemplate, Converter={StaticResource StringToDataTemplateConverter}}">
这个Converter你可以这么写:
publicclassStringToDataTemplateConverter:IValueConverter
{
publicobjectConvert(objectvalue,TypetargetType,objectparameter,CultureInfoculture)
{
returnInternalConvert(value,targetType,parameter);
}
publicobjectConvertBack(objectvalue,TypetargetType,objectparameter,CultureInfoculture)
{
thrownewNotImplementedException();
}
publicobjectInternalConvert(objectvalue,TypetargetType,objectparameter)
{
if(value==null)
{
returnnull;
}
varresources=Application.Current.Resources.MergedDictionaries.ToList();
foreach(vardictinresources)
{
foreach(varobjkeyindict.Keys)
{
if(objkey.ToString()==value.ToString())
{
returndict[objkey]asDataTemplate;
}
}
}
returnnull;
}
}这样一来前端的ItemTemplate就可以和ViewModel的SelectedTemplate完成绑定,你更改SelectedTemplate的值,你的Converter就会在资源字典中查找对应的DataTemplate了。
二、ASP.NET的ItemTemplate用法
在用DataList控件的时候肯定的要用到itemtemplate,现在我就跟大家怎么用它
第一步:先把DataList控件绑定数据库中的某个表,代码如下:
SqlConnection con= new SqlConnection("server=.; uid=sa; pwd=密码; database=数据库");
SqlDataAdapter sd= new SqlDataAdapter("select", con);
DataSet ds= new DataSet();
sd.Fill(ds,"LanMuName");
DataList1.DataSource= ds;
DataList1.DataBind();
第二步;再用itemtemplate绑定表里的某列,代码如下:
<asp:DataList ID="DataList1" runat="server" CellPadding="0">
<ItemTemplate>
<asp:Label ID="CaptionLabel" runat="server"
Text='<%# DataBinder.eval_r(Container.DataItem,"shipname")%>'>
</ItemTemplate>
</asp:DataList>
通过上面两步就可以实现绑定了,现在我为大家解释一下
DataBinder.eval_r(Container.DataItem,"shipname")里各项是什么意思:
DataBinder:数据绑定管理器
Eval:求值
Container:被绑定到的容器,比如GridView,DataList等
DataItem:容器的数据项,包括项、交替模板行
shipname:绑定到容器的字段(来自数据库表字段即表中的列)
三、datalist控件的Items属性是什么意思
Items介绍和作用
Items是DataGridItem的集合,可以遍历当前DataGrid中显示数据的DataGridItem。
5.1、DataGridItem
每一个DataGridItem就是DataGrid中显示的一行,其中包括:
Header DataGrid控件的标题部分
Item DataGrid控件中的项
AlternatingItem DataGrid控件中的交替项
SelectedItem DataGrid控件中的选定项(由SelectedIndex设置,通过SelectedItem属性或者Items[SelectedIndex]来读取)
EditItem DataGrid控件中处于编辑状态的项(由EditItemIndex设置,通过Items[EditItemIndex]来读取)
Separator DataGrid控件中项之间的分隔符
Footer DataGrid控件的脚注部分
Pager DataGrid控件的页选择节
注意,DataGrid的Items属性中不会包含Header、Footer、Pager这三类DataGridItem的。
5.1.1、DataGridItem的属性
ItemIndex——得到行在Items中的索引
ItemType——返回行的类型,也就是上面列出的Header、Item、...、Pager
Cells——返回行包含的所有TableCell(不管是显示声明的,还是自动生成的,不管是可以看见的,还是隐藏掉的),通过TableCell,可以读取Cell中显示的文本、包含的控件
严重注意:只有BoundColumn列和自动生成列,才可以通过TableCell.Text属性读取显示的文本。HyperLinkColumn、ButtonColumn、EditCommandColumn都需要将目标控件转换成相应的控件。
比如:
假设DataGrid的第一列声明如下
<asp:HyperLinkColumn DataTextField="au_id" HeaderText="au_id" DataNavigateUrlField="au_id" DataNavigateUrlFormatString="Edit.aspx?id={0}"></asp:HyperLinkColumn>
读取的时候可以用:
//Items[0]表示第一行,Cells[0]表示第一列,Controls[0]表示Cell中的第一个控件(也只有这个控件可以用)
HyperLink link=(HyperLink)DataGrid1.Items[0].Cells[0].Controls[0]);
Response.Write(link.Text);
至于模板列(TemplateColumn),当然也可以通过DataGrid1.Items[i].Cells[j].Controls[n]来获取,然后转换成原来的控件类型再操作,但是还有个更好的办法,就是用FindControl来查找控件。
FindControl是System.Web.UI.Control的方法,可以根据子控件ID来查找子控件
比如:
假设DataGrid的某一列声明如下
<asp:TemplateColumn>
<ItemTemplate>
<asp:TextBox Runat="server" ID="txtID" Text='<%# DataBinder.Eval(Container.DataItem,"au_id")%>'>
</asp:TextBox>
</ItemTemplate>
</asp:TemplateColumn>
读取方法:
TextBox txt=(TextBox)DataGrid1.Items[1].FindControl("txtID");
Response.Write(txt.Text);
注意:DataList中是没有Cell的