2012-05-15 47 views
3

定义按钮点击处理,我动态创建列在Silverlight 4的用户控制其工作正常数据网格。 数据网格的第一列是一个按钮,所以我用下面的代码添加的DataTemplate为DataGrid:如何编程XAML定义

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”当我添加进去。

这是我应该怎么尝试添加单击处理方法或我应该用别的东西吗?

回答

4

你使用,你指定的Click事件仅在XAML的用户控件中定义的,在这方面工作的命名方法的XAML语法,通过Visual Studio将自动线,你点击生成的代码处理程序。当您在代码中创建XAML时,您必须在生成按钮时找到该按钮,并自己连接点击处理程序。

将各行被渲染,处理加载事件找到按钮,然后线了。这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) 
    { 

    } 
+0

工作非常感谢科林。 – Anto