This question is locked. New answers and comments are not allowed.
Good morning and happy monday. Here is a complete reproducer. I have a grid with a random column name. I create a run-time DataTemplate that I apply to the RadGrid cells. The DataTemplate contains a RadButton. How do I make this button call the cilck handler ?
XAML file is default:
using System; using System.Collections.Generic; using System.Globalization; using System.Text; using System.Windows; using System.Windows.Controls; using System.Windows.Data; using System.Windows.Markup; using Telerik.Data; using Telerik.Windows.Controls; namespace DynamicDataTemplates { public partial class MainPage : UserControl { public MainPage() { InitializeComponent(); RadGridView gv = new RadGridView(); gv.DataLoaded += new EventHandler<EventArgs>(gv_DataLoaded); gv.ItemsSource = GetData(); LayoutRoot.Children.Add(gv); } private static void MoreButton_Click(object sender, ExecutedRoutedEventArgs args) { MessageBox.Show("Button got clicked"); } // apply a dynamic data template to a dynamic column void gv_DataLoaded(object sender, EventArgs e) { RadGridView gv = sender as RadGridView; foreach (GridViewColumn col in gv.Columns) { 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("xmlns:telerik='http://schemas.telerik.com/2008/xaml/presentation' "); sb.Append("xmlns:my='clr-namespace:DynamicDataTemplates;assembly=DynamicDataTemplates'>"); sb.Append("<Grid> "); sb.Append("<Grid.Resources>"); sb.Append("<my:StringConverter x:Key='aStringConverter'/>"); sb.Append("</Grid.Resources> "); sb.Append("<StackPanel Orientation='Horizontal'> "); sb.Append("<TextBlock Text = '{Binding " + col.Header.ToString() + ", Converter={StaticResource aStringConverter}}' /> "); // // *** QUESTION: How do I bind this button to the MoreButton_Click handler ? // sb.Append("<telerik:RadButton Content='More...' /> "); sb.Append("</StackPanel> "); sb.Append("</Grid> "); sb.Append("</DataTemplate> "); string xaml = sb.ToString(); DataTemplate template = XamlReader.Load(xaml) as DataTemplate; col.CellTemplate = template; col.Width = 250; } } // returns a data table - one column - column name is random and contains a really long string public DataTable GetData() { Random r = new Random((int)DateTime.Now.Second); List<string> colNames = new List<string>() { "ColumnA", "ColumnB", "ColumnC", "ColumnD" }; List<string> words = new List<string>() { "apples ", "pears ", "oranges ", "bananas ", "grapefruit ", "grapes ", "mangos ", "tangerines " }; DataTable dt = new DataTable(); string colName = colNames[r.Next() % colNames.Count]; dt.Columns.Add(new DataColumn() { ColumnName = colName, DataType = typeof(string) }); for (int i = 0; i < 10; i++) { string s = ""; for (int j = 0; j < 100; j++) s += words[r.Next() % words.Count]; DataRow dr = dt.NewRow(); dr[colName] = s; dt.Rows.Add(dr); } return dt; } } // chop string for display in grid public class StringConverter : IValueConverter { public object Convert(object value, Type targetType, object parameter, CultureInfo culture) { return ((string)value).Substring(0, 30); } public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) { return ((string)value).ToLower(); } } } XAML file is default:
<UserControl x:Class="DynamicDataTemplates.MainPage" xmlns:my='clr-namespace:DynamicDataTemplates' mc:Ignorable="d" d:DesignHeight="300" d:DesignWidth="400"> <Grid x:Name="LayoutRoot" Background="White"> </Grid> </UserControl>