我正在Silverlight 4中的User控件中动态创建数据网格的列,该控件正常工作。 数据网格的第一列是一个按钮,所以我使用以下代码为DataGrid添加DataTemplate:
DataGridTemplateColumn templateColumn = new DataGridTemplateColumn();
templateColumn.Header = "Search";
StringBuilder sb = new StringBuilder();
sb.Append("<DataTemplate ");
sb.Append("xmlns='http://schemas.microsoft.com/winfx/2006/xaml/presentation' ");
sb.Append("xmlns:x='http://schemas.microsoft.com/winfx/2006/xaml'>");
sb.Append("<Button Name='searchBtn' Width='25' Height='20' Click='performFastSearch' >");
sb.Append("<Image Source='http://localhost/SiteAssets/img/Homepage/ribbon_top_right.png' Stretch='None' />");
sb.Append("</Button>");
sb.Append("</DataTemplate>");
templateColumn.CellTemplate = (DataTemplate)XamlReader.Load(sb.ToString());
如果我将Click =“performFastSearch”部分保留下来,但是当我添加它时,代码就会起作用,但是会在'crossappdomainmarshaledexception'中断。
我应该尝试添加点击处理程序方法,还是应该使用其他方法?
答案 0 :(得分:4)
您正在使用的XAML语法,其中为Click事件指定命名方法只有在用户控件中定义XAML时才有效,在此上下文中,Visual Studio生成的代码将自动连接您的Click处理程序。当您在代码中创建XAML时,您必须在生成此按钮时找到它,并自行连接点击处理程序。
渲染每一行时,处理loading事件以找到Button然后连线。这blog post might help you:
void grid_LoadingRow(object sender, DataGridRowEventArgs e)
{
var btnCol =
m_DataGrid.Columns.FirstOrDefault(
c => c.GetValue(FrameworkElement.NameProperty) as string == "m_BtnColumn");
FrameworkElement el = btnCol.GetCellContent(e.Row);
Button btn = el as Button;
if (btn != null)
{
btn.Click -= new RoutedEventHandler(btn_Click);
btn.Click += new RoutedEventHandler(btn_Click);
}
}
void btn_Click(object sender, RoutedEventArgs e)
{
}