2

我在 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 = ????

        ......
4

1 回答 1

6

DataTemplateswith 刚刚DataType提到但 nox:Key将为他们创建一个隐式密钥。因此,基本上要访问您的 DataTemplate,您需要做的就是创建一个 DataTemplate 键并将其用作您的索引器参数ResourceDictionary

下面的示例代码:

new DataTemplateKey(typeof(TargetViewModel));
于 2013-11-14T20:44:48.967 回答