我有标记扩展允许我同时使用GridView
中的绑定和单元格模板。它在运行时正常工作,但它在设计时不起作用,想知道是否有任何事情可以解决。我已经测试过返回简单的字符串,而不是DataTemplate
,只是为了确保定制标记扩展在设计时能够正常工作 - 并且工作正常,所以它应该与某个事实相关,即返回DataTemplate
。标记扩展在设计时不起作用
[MarkupExtensionReturnType(typeof(DataTemplate))]
public class TemplateBuilderExtension : MarkupExtension
{
public string Path { get; set; }
public TemplateBuilderExtension() { }
public TemplateBuilderExtension(string path)
{
Path = path;
}
// Here be dirty hack.
internal static string TagPath { get; private set; }
public override object ProvideValue(IServiceProvider serviceProvider)
{
TagPath = Path;
var resourceExt = new StaticResourceExtension("GridViewTextCell");
// This line causes the evaluation of the Tag as the resource is loaded.
var baseTemplate = (DataTemplate)resourceExt.ProvideValue(serviceProvider);
return baseTemplate;
}
}
[MarkupExtensionReturnType(typeof(BindingExpression))]
public class TemplateBuilderTagExtension : MarkupExtension
{
public TemplateBuilderTagExtension()
{
}
public override object ProvideValue(IServiceProvider serviceProvider)
{
return new Binding(TemplateBuilderExtension.TagPath);
}
}
<Window.Resources>
<DataTemplate x:Shared="false" x:Key="GridViewTextCell">
<Border BorderBrush="Blue" BorderThickness="1">
<TextBlock Text="{markupExtensions:TemplateBuilderTag}"></TextBlock>
</Border>
</DataTemplate>
</Window.Resources>
<Grid>
<ListView SelectedIndex="5">
<ListView.View>
<GridView>
<GridViewColumn Header="Id" CellTemplate="{markupExtensions:TemplateBuilder Id}" Width="300"/>
</GridView>
</ListView.View>
</ListView>
</Grid>
更新:我已经简化代码,以尽可能短,在现实情况下有多个GridView的申请通过,每个网格包含多个列,并且这些列应该重新使用相同的模板,也无法使用DataGrid因性能问题。
我没有得到这样的想法呢。你是什么意思“使用绑定和单元格模板”?你想在你的细胞模板中使用视觉父母的datacontext吗?然后,您可以采用更简单的方法 – deafjeff 2014-12-02 10:19:17
事情是,如果您希望使用单元格模板,则需要为每列定义它,因为您无法将绑定路径传递给单元格模板。有问题的代码解决了这个问题。 – Giedrius 2014-12-02 10:59:30
这不是DataTemplate Selector的候选人吗? – deafjeff 2014-12-02 13:10:53