当DataTemplate没有密钥时,从ResourceDictionary访问DataTemplate,只有TargetType

时间:2013-11-14 19:57:53

标签: wpf code-behind resourcedictionary targettype

我在XAML中定义了一个带有代码隐藏的ResouceDictionary。我需要使用鼠标事件和数据绑定来定义一些特定于视图的行为,为此我需要访问DataTemplate中定义的一些元素。

问题是,DataTemplate没有Key它只有一个TargetType(需要这样才能让WPF自动将它用于给定的类型)。

那么,如何从代码隐藏中访问DataTemplate?

编辑:

如果我在构造函数中的某处放置断点,我可以看到我的ViewModel的模板就在那里。似乎ResourceDictionary.Keys属性是一个对象数组,我想要访问的键(或实际上相应的值)在调试器中是这样的:

{DataTemplateKey(Company.Application.ViewModels.TargetViewModel)}

XAML:

<sys:Double x:Key="escala">10</sys:Double>
<sys:Double x:Key="raio">20</sys:Double>
<EllipseGeometry x:Key="geometriacirculo"
    RadiusX="{StaticResource raio}"
    RadiusY="{StaticResource raio}"/>
<ScaleTransform x:Key="transform" ScaleX="{StaticResource escala}" ScaleY="{StaticResource escala}" />
<ap:NormalConverter x:Key="NormalConverter"/>   
<ap:BitmapToSource x:Key="BitmapToSource"/>

<DataTemplate DataType="{x:Type vm:TelaColetaViewModel}">
        <.....

代码隐藏:

public partial class TelaColetaTemplate : ResourceDictionary
{

    EllipseGeometry _geometria_circulo;
    ScaleTransform _scale_transform;
    Grid GridZoom;
    Path CirculoGuia;

    double _escala;

    Point? _ponto_clicado_norm;     

    public TelaColetaTemplate()
    {
        InitializeComponent();

        // three following lines work, accessing them with key, no problem
        _geometria_circulo = (EllipseGeometry)this["geometriacirculo"];
        _scale_transform = (ScaleTransform)this["transform"];
        _escala = (double)this["escala"];


        //var wantedTemplate = ????

        ......

1 个答案:

答案 0 :(得分:5)

DataTemplates仅提及DataType但没有x:Key将为其创建隐式密钥。因此,基本上要访问您的DataTemplate,您需要做的就是创建一个DataTemplate Key并使用它作为ResourceDictionary的索引器参数

以下示例代码:

new DataTemplateKey(typeof(TargetViewModel));