【发布时间】:2014-12-02 09:41:02
【问题描述】:
我有标记扩展允许我同时在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问题。
【问题讨论】:
-
我还不知道这个。 “使用绑定和单元格模板”是什么意思?您是否想要 celltemplate 中的视觉父母的数据上下文?然后你可以走一个更简单的方法
-
问题是,如果你想使用单元格模板,你需要为每一列定义它,因为你不能将绑定路径传递给单元格模板。有问题的代码解决了问题。
-
那不是数据模板选择器的候选者吗?
-
从 GridViewRowPresenter 代码看来它没有帮助 - 它只是使用类来选择单元格模板,但不会对绑定做任何事情。
-
在您的情况下,它是 CellTemplateSelector,它允许您为您的列选择适当的模板。那么就不需要使用模板绑定了。
标签: c# wpf xaml design-time markup-extensions