2011-08-25 15 views
1

私はカスタムクラスを持っています。クラスを静的リソースとして宣言しない限り、依存関係プロパティはバインディングでは機能しません。 私のXAML:静的リソースとしない限り、依存関係プロパティのバインディングはクラスに対して機能しません

<sdk:Frame prism:RegionManager.RegionName="MainContentRegion"> 
    <sdk:Frame.ContentLoader> 
     <myLibrary:RegionNavigationContentLoader 
      RegionManager="{Binding RegionManager}" 
      RegionName="MainContentRegion" /> 
    </sdk:Frame.ContentLoader> 
</sdk:Frame> 

マイカスタムローダークラス:

public class RegionNavigationContentLoader : FrameworkElement, INavigationContentLoader 
{ 

    public static readonly DependencyProperty RegionManagerProperty = DependencyProperty.Register("RegionManager", typeof(IRegionManager), typeof(RegionNavigationContentLoader), new PropertyMetadata(null)); 
    public IRegionManager RegionManager { 
     get { return (IRegionManager)GetValue(RegionManagerProperty); } 
     set { SetValue(RegionManagerProperty, value); } 
    } 

    public static readonly DependencyProperty RegionNameProperty = DependencyProperty.Register("RegionName", typeof(string), typeof(RegionNavigationContentLoader), new PropertyMetadata(null)); 
    public string RegionName { 
     get { return (string)GetValue(RegionNameProperty); } 
     set { SetValue(RegionNameProperty, value); } 
    } 

    ... 
} 

私は資源としてローダを宣言して、フレームに結合staticresourceとしてそれを渡すときには、しかし、正常に動作しません。

<Grid.Resources> 
    <myLibrary:RegionNavigationContentLoader x:Key="RegionLoader" 
     RegionManager="{Binding RegionManager}" 
     RegionName="MainContentRegion" /> 
</Grid.Resources> 

<sdk:Frame prism:RegionManager.RegionName="MainContentRegion" 
    ContentLoader="{StaticResource RegionLoader}"/> 

これは大きな問題ではありませんが、私はその理由を知りたいと思います。誰でも知っていますか?

+0

「うまくいかない」とはどういう意味ですか?デバッガの下で実行すると、バインディングエラーが出力ウィンドウに表示されますか? –

+0

Joe - バインディングエラーは報告されていませんでした。私のプロパティの設定者は、私がデバッガでそれらを踏んだときにヒットしませんでした。 – Adam

+1

アダムは、動作してもセッターはとにかくヒットしないことに注意してください。バインディングは、標準の.NETプロパティーセッターを迂回して、 'SetValue'を介してDependencyプロパティーに値を割り当てます。 – AnthonyWJones

答えて

1

ContentLoaderプロパティは、単にINavigationContentLoaderの実装を予期しています。

FrameworkElement、またはDependencyObjectを受信する予定はなく、特定のインターフェイスを実装する普通の普通の普通のクラスしか期待していません。結果として、提供されたインスタンスを参照するだけで、それ以外は何もしません。

これはつまり、RegionNavigationContentLoaderのインスタンスが直接バインディングとともに作成され、バインディングでDataContextが見つからない場合、DataContextの検索が親を見つけることができないためRegionNavigationContentLoaderで終了します。 。

一方、インスタンスを作成してUserControlが所有するResourceDictionary(DependencyObject)に追加すると、データコンテキストを持つバインディングでは、探しているものを見つけることができます。この同じオブジェクトは、その後、静的リソースによってFrameに割り当てられます。

ところで、FrameworkElementから派生する必要がありますか?DependencyObjectはありませんか?

+0

アンソニーありがとう。 FrameworkElementの代わりにDependencyObjectから継承すると、動作します。今、なぜ私は完全に理解できません。 FrameworkElementはDependencyObjectから継承するUIElementを継承しているためです。違いはなんですか?少し詳しく説明できますか? – Adam

+1

@AdamD:うーん、結果!私はそれを期待していなかったので、私はなぜ推測することができます。バインディングのターゲットが 'FrameworkElement'ではない場合、' BindingExpression'は実行時に特別な 'FrameworkElement'を作成してターゲットオブジェクトをラップするよう要求します。その特別なインスタンスの' FrameworkElement'は、知りません。どのように私は見ることができません。おそらくXamlパーサー自体が遊ぶべき部分を持っているかもしれませんが、それが立っているので、私はこの作業をする仕組みを見極められません。とても好奇心が強い。 – AnthonyWJones

+0

これは奇妙なものです – Adam

関連する問題