我尝试通过代码动态创建并将DataTemplate
指定给HeaderTemplate
的DataGrid
。为此,我有一个方法GetDatatemplate(string fromstring)
,它定义了一个XML文字,然后用它来创建一个DataTemplate
。只要我不在DataTemplate
中包含MouseLeftButtonDown
事件处理程序,这工作正常。如何在代码中为DataTemplate分配事件处理程序?
我DataTemplate
保存在string
变量的代码隐藏称为StringHeaderTemplate
的MainWindow.xaml.cs
:
private string StringHeaderTemplate [email protected]"<DataTemplate>
<DataTemplate.Resources>
<ControlTemplate x:Key=""imgNo"" TargetType=""{x:Type Control}"">
<Image Source = ""pack://application:,,,/Images/upArrow.png"" />
</ControlTemplate >
<ControlTemplate x:Key=""imgUp"" TargetType=""{x:Type Control}"">
<Image Source = ""pack://application:,,,/Images/upArrow.png"" />
</ControlTemplate >
<ControlTemplate x:Key=""imgDown"" TargetType=""{x:Type Control}"" >
<Image Source = ""pack://application:,,,/Images/downArrow.png"" />
</ControlTemplate >
</DataTemplate.Resources>
<Grid Background=""Transparent"" MouseLeftButtonDown=""Grid_MouseLeftButtonDown"">
<Grid.RowDefinitions>
<RowDefinition/>
<RowDefinition/>
<RowDefinition/>
</Grid.RowDefinitions>
<Button Content=""Hello""/>
<TextBlock Grid.Row=""1"" HorizontalAlignment= ""Center"" Text = ""TextBlock"" />
<CheckBox Grid.Row= ""2"" HorizontalAlignment= ""Center"" IsChecked= ""True"" />
</Grid >
</DataTemplate>";
和获取方法DataTemplate
:
private DataTemplate GetDatatemplate(string fromstring)
{
ParserContext context = new ParserContext();
context.XmlnsDictionary.Add("", "http://schemas.microsoft.com/winfx/2006/xaml/presentation");
context.XmlnsDictionary.Add("x", "http://schemas.microsoft.com/winfx/2006/xaml");
return (DataTemplate)XamlReader.Parse(fromstring, context);
}
然后我申请HeaderTemplate
DataGrid
这个DataTemplate
到:
private void dg_AutoGeneratingColumn_1(object sender, DataGridAutoGeneratingColumnEventArgs e)
{
DataTemplate dtCell = null;
DataTemplate dtHeader = null;
string dtString = string.Empty;
string dtHeaderString = string.Empty;
switch(Type.GetTypeCode(e.PropertyType))
{
case TypeCode.String:
dtString = StringTemplate.Replace("xxColumnxx", e.PropertyName);
dtHeaderString=StringHeaderTemplate;
break;
}
if(!string.IsNullOrEmpty(dtString))
{
dtCell = GetDataTemplateForDataGrid(dtCellString);
dtHeader = GetDataTemplateForDataGrid(dtHeaderString);
DataGridTemplateColumn c = new DataGridTemplateColumn()
{
CellTemplate = dtCell,
HeaderTemplate = dtHeader,
};
e.Column = c;
}
}
事件处理程序是非常简单的:
private void Grid_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
MessageBox.Show(DateTime.Now.ToString());
}
的例外,我得到的是有一个类型的ArgumentException的的InnerException,上面写着一个XamlParseException:
“无法绑定到目标的方法,因为其签名或安全性 透明度与委托类型不兼容。“
任何想法该怎么办?
更新:
我试图通过Command
绑定,但是CallSortingCommand
不叫。也许你知道我做错了什么?
<Grid Background=""Transparent"">
<i:Interaction.Triggers>
<i:EventTrigger EventName=""MouseLeftButtonDown"">
<prism:InvokeCommandAction Command = ""{Binding
RelativeSource={RelativeSource AncestorType=Window,
Mode=FindAncestor}, Path=DataContext.CallSortingCommand}"" />
</i:EventTrigger>
</i:Interaction.Triggers>
<Grid.RowDefinitions>
<RowDefinition/>
<RowDefinition/>
<RowDefinition/>
</Grid.RowDefinitions>
<Button Content=""Hello""/>
<TextBlock Grid.Row=""1"" HorizontalAlignment= ""Center"" Text = ""TextBlock"" />
CheckBox Grid.Row= ""2"" HorizontalAlignment= ""Center"" IsChecked= ""True"" />
</Grid >
什么StringTemplate的? –
'private string StringHeaderTemplate = @'omg stop right there ...你在做什么?DataTemplates应该在你的资源中定义。如果你需要自定义逻辑来选择一个数据模板,创建并使用一个DataTemplateSelector 。怎么回事我连 –
Will