2016-04-14 38 views
7

Cannot find governing FrameworkElement or FrameworkContentElement for target elementエラーのビットを調べた後、依存関係オブジェクトがFrameworkElementsでないか、 1つの要素ツリーにあります。オブジェクトがFrameworkElementの論理ツリーにある場合でも、DependencyObjectはターゲット要素の統治FrameworkElementを見つけることができません

ただし、私はDependencyObjectsを所有するFrameworkElementを持っており、FrameworkElement論理ツリーの一部であっても、それらのDependencyObjectsプロパティにバインディングを送信することはできません。

私は複雑なカスタムコントロールをサブ要素で作成していますが、これらのサブ要素をDependencyObjectsにする必要があります(FrameworkElementsではなく、多くのプロパティを使用して汚染され、ユーザーを混乱させる可能性があるため)、また、DependencyPropertiesをバインド可能にする必要があります。

私には何が欠けていますか? DependencyObjectsに論理ツリー内にあることを知らせるために必要なことがありますか?凍結されても意味がないとしても、私はそれらをFreezableにする必要がありますか?

乾杯

+0

すべての依存関係プロパティはバインド可能です。明示的なSourceがない作品はバインドできません。あなたの質問については、今のところ、プロパティがビジュアルツリーまたは論理ツリーの一部でない場合、親データコンテキストを継承する唯一のオプションは、実際にフリーズ可能にするようです。 – Evk

+0

@エヴァーク:少し研究して遊んだ後、私は自分のプロパティがライブツリーインスペクタに表示されないことを知りました。 LogicalChildren列挙子をオーバーライドすれば十分だろうと確信していたので、これをさらに調査する必要があります。 –

答えて

1

私はあなたの結論&推論は完全に間違っていると思います。

まず最初DependencyObjectから派生しWPFすべてです。 FrameworkElementクラスは違いはありません。あなたが作成しようとしたのであれば>FrameworkElement

- >Visual - - >UIElement

DependencyObject:あなたはFrameworkElement classsの階層を見ればそれは順序以下のようなものですDependency Property上記のクラスのいずれかから派生したクラスでは、正常に動作します(直接バインディングを除き、他の方法でバインドすること(下記の例を参照))。 CustomControlCustomControlまたはUserControlを使用しているかどうかわからない)コードに問題がある必要があります。

しかしUIElementから派生したクラスは、他の要素にバインドすることができDependencyPropertiesを持つことができます。

それはDependencyPropertiesをたくさん持っている、UIElementクラスを参照してください。

UIElement

我々はそれに見ることができ、あなたのコントロールのコードを共有してください。

UPDATE:

DependencyObject実装:

public class MyClass : DependencyObject 
{ 
    public MyClass() 
    { 
     this.Button = new Button(); 
     Button.Width = 500; 
     Button.Height = 400; 
     Button.Content = "Bound to Window Height"; 
    } 

    private Binding height; 
    public Binding Height 
    { 
     get { return height; } 
     set 
     { 
      height = value; 
      ApplyBinding(); 
     } 
    } 

    public Button Button { get; set; } 
    private void ApplyBinding() 
    { 
     this.Button.SetBinding(Button.HeightProperty, this.Height); 
    } 

} 
ここ

DependecyObject'sDependencyPropertyをバインドする方法の例があります

public partial class MyUserControl : UserControl 
{ 
    public MyUserControl() 
    { 
     InitializeComponent(); 
    } 

    public MyClass MyClass 
    { 
     get { return (MyClass)GetValue(MyClassProperty); } 
     set { SetValue(MyClassProperty, value); } 
    } 

    // Using a DependencyProperty as the backing store for MyClass. This enables animation, styling, binding, etc... 
    public static readonly DependencyProperty MyClassProperty = 
     DependencyProperty.Register("MyClass", typeof(MyClass), typeof(MyUserControl), new UIPropertyMetadata(new PropertyChangedCallback(MyClassPropertyChanged))); 


    private static void MyClassPropertyChanged(DependencyObject DO, DependencyPropertyChangedEventArgs e) 
    { 
     var MUC = DO as MyUserControl; 
     if (e.NewValue != null) 
     { 
      var myClass = e.NewValue as MyClass;     
      MUC.MyCanvas.Children.Add(myClass.Button); 
     } 
    } 

} 

そして最後にバインディング::

<Window x:Class="WpfStackOverflowTempProject.MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Title="MainWindow" Width="525" 
    DataContext="{Binding RelativeSource={RelativeSource Mode=Self}}" 
    xmlns:local="clr-namespace:WpfStackOverflowTempProject"  
    Height="{Binding ElementName=UIContent,Path=MyClass.HeightReplica,Mode=OneWayToSource}" 
    > 
<local:MyUserControl x:Name="UIContent" > 
    <local:MyUserControl.MyClass> 
     <local:MyClass Height="{Binding RelativeSource={RelativeSource AncestorType=Window},Path=ActualHeight,Mode=OneWay}" /> 
    </local:MyUserControl.MyClass> 
</local:MyUserControl> 

私たちの DependencyObject実装を使用しています

A UserControlしたがって、上記のプログラムの出力として

我々はXAMLコードでButtonへの結合自体を行っているように私たちのWindow変化、 のHeightは、それが戻って私たちのMyClassコンポーネントのボタンelement に反映されます。 それは実際にUI上に表示される、それが公開されたプロパティ/バインディング を指定し、子要素に対応するそれらの振る舞いを定義するための 子要素だ論理親コントロール&だ 間ので MyclassがインタフェースでありますMyClassは、慣用的な使用のためのフィルタのように のみで動作します。

+1

著者は別のことを意味します。 を実行すると、何が問題であるかがわかります(動作しません)。 FreezableからあなたのMyClassを継承すると、それが動作します。 – Evk

+0

@EvkここでFreezableの使用についてはわかりませんが、それ以外の場合は、上記の説明を繰り返しています。私の主張は、もしOPがdependencyObjectでDPを束縛するようなことをしていたら、他のUI要素と逆の方法でそれを行うことができるとすれば、彼にとっては可能だと言っていました。 –

+0

@Evk Freezableについて私はそれがバインディングやバインディングの問題を引き起こしたことを覚えています。(DP値の反映は覚えていますが、あまりよく分かりません) –

関連する問題