动态的DataTemplate与valueconverter [英] dynamic datatemplate with valueconverter
问题描述
我想在wpftoolkit数据网格,其中的数据是
I want to show data in a wpftoolkit datagrid where the data is a collection of
public class Thing
{
public string Foo { get; set; }
public string Bar { get; set; }
public List<Candidate> Candidates { get; set; }
}
public class Candidate
{
public string Name { get; set; }
public CandidateType CandidateType { get; set; }
}
public enum CandidateType
{
Type1,
Type2,
Type42
}
在哪里候选人名单的候选人数目在运行时配置。
where the number of candidates in Candidates list is configurable at runtime.
所需的网格布局看起来像这样
Desired grid layout looks like this
美孚|酒吧|候选人1 |候选2 | ... |候选ñ
这样看来,我不能创建在XAML考生的绑定表达式会改变一个DataTemplate。
Thus it seems I cannot create a DataTemplate for the candidates in xaml as the binding expression will change.
我在AutoGeneratedColumns事件中添加必要的列,像这样:
I add necessary columns in AutoGeneratedColumns event like so:
private void DataGrid_AutoGeneratedColumns(object sender, EventArgs e)
{
ViewModel vm = DataContext as ViewModel;
for (int i = 0; i < vm.LotsOfThings.First().Candidates.Count; i++)
{
string assName = Assembly.GetExecutingAssembly().GetName().Name;
ParserContext ctx = new ParserContext();
ctx.XamlTypeMapper = new XamlTypeMapper(new string[] { assName });
ctx.XamlTypeMapper.AddMappingProcessingInstruction("src", "WpfToolkitDataGridTester", assName);
ctx.XmlnsDictionary.Add("", "http://schemas.microsoft.com/winfx/2006/xaml/presentation");
ctx.XmlnsDictionary.Add("x", "http://schemas.microsoft.com/winfx/2006/xaml");
ctx.XmlnsDictionary.Add("src", "clr-namespace:WpfToolkitDataGridTester;assembly=" + assName);
var template = XamlReader.Parse(@"<DataTemplate>
<DataTemplate.Resources>
<src:FooConverter x:Key='fooConverter' />
</DataTemplate.Resources>
<TextBlock
Foreground='{Binding Candidates[" + i + @"].CandidateType,Converter={StaticResource fooConverter}}'
Text='{Binding Candidates[" + i + @"].Name}' />
</DataTemplate>", ctx) as DataTemplate;
dg.Columns.Add(new DataGridTemplateColumn
{
Header = "Candidate " + (i + 1),
CellTemplate = template
});
}
}
然而,这失败,但以下情况除外:
上的标签'FooConverter'不存在XML命名空间存在'CLR命名空间:WpfToolkitDataGridTester;装配= WpfToolkitDataGridTester。行'3'位'54'。
This however fails with the following exception: The tag 'FooConverter' does not exist in XML namespace 'clr-namespace:WpfToolkitDataGridTester;assembly=WpfToolkitDataGridTester'. Line '3' Position '54'.
更改的StaticResource到DynamicResource不作任何改变。
Changing the StaticResource to DynamicResource makes no change.
我是什么?我缺少
FWIW:硬编码的DataTemplate
FWIW: a hardcoded datatemplate
<DataTemplate x:Key="candidateTemplate">
<DataTemplate.Resources>
<src:FooConverter x:Key="fooConverter" />
</DataTemplate.Resources>
<TextBlock
Foreground="{Binding Candidates[0].CandidateType,Converter={StaticResource fooConverter}}"
Text="{Binding Candidates[0].Name}" />
</DataTemplate>
和像这样
<wpftk:DataGridTemplateColumn CellTemplate="{StaticResource candidateTemplate}" />
作品,但显然不会产生期望的结果为考生[0]是固定的。
'works' but obviously does not produce the desired result as Candidates[0] is hardcoded.
推荐答案
无论出于何种原因,它按预期工作,如果我做这样的...
For whatever reason, it works as expected if I do like this...
string assName = Assembly.GetExecutingAssembly().GetName().Name;
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:src='clr-namespace:WpfToolkitDataGridTester;assembly=" + assName + "' >");
sb.Append("<DataTemplate.Resources>");
sb.Append("<src:FooConverter x:Key='fooConverter' />");
sb.Append("</DataTemplate.Resources>");
sb.Append("<TextBlock ");
sb.Append("Foreground='{Binding Candidates[" + i + "].CandidateType,Converter={StaticResource fooConverter}}' ");
sb.Append("Text='{Binding Candidates[" + i + @"].Name}' />");
sb.Append("</DataTemplate>");
var template = (DataTemplate)XamlReader.Parse(sb.ToString());
这篇关于动态的DataTemplate与valueconverter的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!