我需要创建一个具有不同列的数据网格。列之一必须是指向URL的超链接。例如,我可能在网格中有人的记录,那里的名称将链接到用户文件的URL ging。这是通过Silverlight使用程序创建的超链接完成的。
我通过执行RowDataBind方法在asp中进行了此操作,我需要在Silverlight中进行此操作:
protected void gvOrderData_RowDataBound(object sender, GridViewRowEventArgs e)
{
if (e.Row.RowType == DataControlRowType.DataRow)
{
// Setup links
string OrderLink = "'http://crm1:5555/sfa/salesorder/edit.aspx?id={";
e.Row.Cells[0].Attributes.Add("onclick", "window.open(" + OrderLink + DataBinder.Eval(e.Row.DataItem, "SalesOrderID").ToString() + "}','tester','scrollbars=yes,resizable=yes');");
e.Row.Cells[0].Attributes.Add("onmouseover", "this.style.cursor='pointer'");
}
}
为什么需要用代码来完成?可以使用带有适当模板的DataGridTemplateColumn在XAML中完成,例如:
<sdk:DataGridTemplateColumn Header="View" CellTemplate="{StaticResource MyDataTemplate}">
</sdk:DataGridTemplateColumn>
..并在页面资源中定义模板
<DataTemplate x:Key="MyDataTemplate">
<HyperlinkButton x:Name="ViewLink"
Style="{StaticResource ViewButton}"
Click="ViewLink_Click">
</HyperlinkButton>
</DataTemplate>
您可以在后面的代码中添加一些逻辑以打开子窗口,或者遵循纯净的MVVM路径,添加用于处理超链接单击事件的命令。
不幸的是,您无法在代码中创建DataTemplate ...但是您可以在XAML中创建DataTemplate作为资源,并将其分配给代码中的列:
((DataGridTemplateColumn)dg.Columns[0]).CellTemplate = (DataTemplate)this.Resources["dt"];