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 に答える