1

私は次のコードを持っています:

<Style TargetType="{x:Type gc:EdgeControl}">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type gc:EdgeControl}">
                <Path Stroke="Black"
                      StrokeThickness="1"
                      MinWidth="1"
                      MinHeight="1"
                      ToolTip="Transition"
                      x:Name="edgePath">
                    <Path.Data>
                        <PathGeometry>
                            <PathGeometry.Figures>
                                <MultiBinding Converter="{StaticResource routeToPathConverter}">
                                    <Binding RelativeSource="{RelativeSource TemplatedParent}"
                                             Path="Source.(gc:GraphCanvas.X)" />
                                    <Binding RelativeSource="{RelativeSource TemplatedParent}"
                                             Path="Source.(gc:GraphCanvas.Y)" />
                                    <Binding RelativeSource="{RelativeSource TemplatedParent}"
                                             Path="Source.ActualWidth" />
                                    <Binding RelativeSource="{RelativeSource TemplatedParent}"
                                             Path="Source.ActualHeight" />
                                    <Binding RelativeSource="{RelativeSource TemplatedParent}"
                                             Path="Target.(gc:GraphCanvas.X)" />
                                    <Binding RelativeSource="{RelativeSource TemplatedParent}"
                                             Path="Target.(gc:GraphCanvas.Y)" />
                                    <Binding RelativeSource="{RelativeSource TemplatedParent}"
                                             Path="Target.ActualWidth" />
                                    <Binding RelativeSource="{RelativeSource TemplatedParent}"
                                             Path="Target.ActualHeight" />
                                    <Binding RelativeSource="{RelativeSource TemplatedParent}"
                                             Path="RoutePoints" />
                                            </MultiBinding>
                            </PathGeometry.Figures>
                        </PathGeometry>
                    </Path.Data>
                </Path>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

これは私にとってはうまくいきます。しかし今、テンプレートを独自のファイルにリファクタリングしたいと考えています。私は次のことを試しました:

新しいファイル FsmTransitionControl.xaml

<UserControl x:Class="LogicEditor.View.FsmTransitionControl"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
         xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
         xmlns:gc="clr-namespace:GraphSharp.Controls;assembly=GraphSharp.Controls"
         xmlns:viewmodel="clr-namespace:LogicEditor.ViewModel"
         mc:Ignorable="d" 
         d:DesignHeight="300" d:DesignWidth="300">
    <UserControl.Resources>
        <viewmodel:EdgeRouteToPathConverter x:Key="routeToPathConverter" />
    </UserControl.Resources>
    <Grid>
        <Path Stroke="Black"
                      StrokeThickness="1"
                      MinWidth="1"
                      MinHeight="1"
                      ToolTip="Transition"
                      x:Name="edgePath">
            <Path.Data>
                <PathGeometry>
                    <PathGeometry.Figures>
                        <MultiBinding Converter="{StaticResource routeToPathConverter}">
                            <Binding RelativeSource="{RelativeSource TemplatedParent}"
                                             Path="Source.(gc:GraphCanvas.X)" />
                            <Binding RelativeSource="{RelativeSource TemplatedParent}"
                                             Path="Source.(gc:GraphCanvas.Y)" />
                            <Binding RelativeSource="{RelativeSource TemplatedParent}"
                                             Path="Source.ActualWidth" />
                            <Binding RelativeSource="{RelativeSource TemplatedParent}"
                                             Path="Source.ActualHeight" />
                            <Binding RelativeSource="{RelativeSource TemplatedParent}"
                                             Path="Target.(gc:GraphCanvas.X)" />
                            <Binding RelativeSource="{RelativeSource TemplatedParent}"
                                             Path="Target.(gc:GraphCanvas.Y)" />
                            <Binding RelativeSource="{RelativeSource TemplatedParent}"
                                             Path="Target.ActualWidth" />
                            <Binding RelativeSource="{RelativeSource TemplatedParent}"
                                             Path="Target.ActualHeight" />
                            <Binding RelativeSource="{RelativeSource TemplatedParent}"
                                             Path="RoutePoints" />
                        </MultiBinding>
                    </PathGeometry.Figures>
                </PathGeometry>
            </Path.Data>
        </Path>
    </Grid>
</UserControl>

元のファイル:

<Style TargetType="{x:Type gc:EdgeControl}">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type gc:EdgeControl}">
                <view:FsmTransitionControl DataContext="{Binding RelativeSource={RelativeSource TemplatedParent}}"/>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

これは機能しません (何も表示されません)。コンパイル時にエラーは発生せず、デバッグ出力にもエラーはありませんが、IntelliSenseでは、タイプ 'Multibinding' のインスタンスをタイプ 'PathFigureCollection' のコレクションに追加できませんと表示されます。「PathFigure」タイプのアイテムのみが許可されます。Path-Object のコードが以前とまったく同じであるため、これは理解できません。

グリッドに別のコントロールを追加すると、次のようになります。

<Label Content="{Binding Source.ActualWidth}"/>) 

コントロールとデータバインディングは問題なく動作します。

新しい UserControl の DataContext は問題ないようです (タイプは EdgeControl です)。

Visual Studio 2012 Update 3 を使用しています

誰でも助けることができますか?

4

1 に答える 1

2

MultiBindingに関連するソースを残しましたTemplatedParentが、テンプレート化された親はもうありません。バインディングから外せば、うまくいくと思います。次のMultiBindingようになります。

<MultiBinding Converter="{StaticResource routeToPathConverter}">
  <Binding Path="Source.(gc:GraphCanvas.X)" />
  <Binding Path="Source.(gc:GraphCanvas.Y)" />
  <Binding Path="Source.ActualWidth" />
  <Binding Path="Source.ActualHeight" />
  <Binding Path="Target.(gc:GraphCanvas.X)" />
  <Binding Path="Target.(gc:GraphCanvas.Y)" />
  <Binding Path="Target.ActualWidth" />
  <Binding Path="Target.ActualHeight" />
  <Binding Path="RoutePoints" />
</MultiBinding>

DataContextうまく動作すると言ったUserControlので、ソースを指定する必要はありません。

于 2013-09-10T11:03:11.160 に答える