2011-03-18 19 views
0

私は*のの.xamlでのDataTemplateを持って、それは私のListViewコントロールのためのDataTemplateです:私のC#コードでWPF:なぜ私のDataTemplateアイテムがその親を見つけることができませんか?

<DataTemplate x:Key="listViewSourceItemTemplate" DataType="{x:Type this:SourceItemField}"> 
    <this:SourceItemField Background="LightPink"> 
    <i:Interaction.Behaviors> 
     <ei:MouseDragElementBehavior/> 
    </i:Interaction.Behaviors> 
    <StackPanel Orientation="Horizontal" Margin="5,10,5,10" Background="LightGray"> 
     <TextBlock Text="{Binding Path=FieldType,StringFormat=\{0\}}" Margin="0,0,5,0" /> 
     <TextBlock Text="{Binding Path=ContextName,StringFormat=\{0\}}" Margin="0,0,5,0" /> 
     <TextBlock Text="{Binding Path=FieldName,StringFormat=\{0\}}" Margin="0,0,5,0" /> 
     <TextBlock Text="{Binding Path=ConnectionNumber,StringFormat=\{0\}}" Margin="0,0,5,0" /> 
    </StackPanel> 
</this:SourceItemField> 

、私はプログラムを次ています

public void SetPosition() 
    { 
     Center = this.TransformToAncestor(FindAncestor<Canvas>(this)).Transform(new Point(this.ActualWidth/2, this.ActualHeight/2)); 
    } 


    // walk up the visual tree for parent of type T 
    private static T FindAncestor<T>(DependencyObject current) 
     where T : DependencyObject 
    { 
     do 
     { 
      if (current is T) 
      { 
       return (T)current; 
      } 
      current = VisualTreeHelper.GetParent(current); 
     } 
     while (current != null); 
     return null; 
    } 

」これはSourceItemFieldで、なぜVisualTreeHelper.GetParent()がその祖先を "null"として返すのですか?なぜこのSourceItemFieldの親は私のリストビューではありませんか?

答えて

0

祖先としてListViewではなくCanvasを検索してもよろしいですか?

すなわちの代わりに、この:

公共ボイドSetPosition()
{
センター= this.TransformToAncestor(FindAncestor < キャンバス>(この))(新しい ポイント(これを変換します。。 ActualWidth/2、 this.ActualHeight/2));
}


この:

public void SetPosition() 
{ 
    Center = this.TransformToAncestor(FindAncestor<ListView>(this)).Transform(new Point(this.ActualWidth/2, this.ActualHeight/2)); 
} 
+0

はい、私はキャンバスを見つけたいです。実際、私はキャンバスに2つのlistview(listviewSourceとlistviewTarget)があり、listviewSourceにはlistviewSourceItemTemplateという名前のDataTemplateのソースアイテムが含まれています。listviewTargetには、listviewTargetItemTemplateという名前のDataTemplateのターゲットアイテムが含まれています。私は、ソース項目の1つとターゲット項目の1つの間に接続線を描きたいと思います。私のソース項目とターゲット項目の両方が移動可能です。だから私は動的に接続線を更新する必要がありますので、私は自分のキャンバス上の絶対的な場所を知る必要があります。 – spspli

+0

実際に私は試みました:1つのソース項目Aと1つのターゲット項目BをmyCanvasという名前のキャンバスに配置し、AとBの間で動的に接続(実際にはパス)を描くことができます。Aと同じ機能 "FindAncestor"祖先 - myCanvas。だから私はなぜdataTemplateとlistviewを使うのが混乱しているのですが、うまくいきません。 – spspli

+0

私はWPFの新機能ですが、理由を調べようとしました。このdataTemplateとsouceItemFieldをdataTemplate内に使用しているかどうかは疑問です。リストビューをビジュアルペアレントとして識別することはできませんか?ビジュアルツリーとロジックツリーがあり、コントロール間に階層関係があります。だから私は、ビジュアルツリーがdataTemplateのアイテムとこのアイテムを含むリストビューとの間にこのようなヒエラルリを作成しないかどうか疑問に思います。誰がこれについて知っていますか? – spspli

関連する問題