2011-12-21 7 views
1

私はWPFカスタムコントロールを作成していて、状況に遭遇しました。多くのコードは、コントロールが初期化されるまで実行されません。if (this.IsInitialized) { ... }しかし、初期化されていないため、これが原因でデザイナーに問題が発生しています。DesignerProperties.GetIsInDesignMode(...)を使用した場合に発生する可能性のある問題?

カスタムコントロールでDesignerProperties.GetIsInDesignMode()を使用するのが普通ですが、もしそうなら、私はどんな落とし穴にも注意する必要がありますか?デザイナー特有のチェック/コードをカスタムコントロールに持たせるのはちょっと汚いと思われるので、私はこれを尋ねます。

Microsoftがデザイナ固有のコード(属性ではない)をコントロールコードで使用しているかどうかを知るには、良い測定方法があると思いますか?

答えて

1

これは、この方法が最初に存在する主な理由の1つです。

コードロジックにデザイン固有のチェックを入れるのが「汚い」と感じることに同意しますが、時には最も実用的なアプローチです。個人的には、コントロールをデザインモードでうまく動作させることがカスタムコントロールの必要な実装と機能の一部であると考えています。この場合、特にそのケースを処理するためのコードが必ずしも悪いとは限りません。コントロールが初期化されるまで、多くのコードが実行されない

しかし私は、このコードをよく見てお勧めします。 WPFでカスタムコントロールを作成する場合、コードが初期化されているかどうかではなく、バインドされているデータに基づいて実行されるコードを持つ方がよい場合があります。バインドされたデータやプロパティに基づいてコードを実行する場合は、デザイナで実行しているのかアプリケーションを実行しているのかは関係ありません。

+0

私はそれが私はプロパティが設定されていることを順序の問題を回避するために、IsInitializedチェックしてOnPropertyChangedをメソッドを守るために持っていただけのことだ...重く依存関係プロパティと読み取り専用の依存関係プロパティを使用しています。 'は、'です。私を信じて、私はこれらの2 DPが相互に絡み合っていて、呼び出し前の呼び出しの順序が説明されていなければ問題を引き起こすという点を除いて、IsInitializedを使う必要は一度もありません。 –

+0

@ m-y代わりにヌル/​​無効の状態を確認することはできません。何が原因でデザイン時には失敗しますが、実行時には機能しますか? –

+0

基本的に私は、2つのDPがお互いに等しくない状況があります。これらは文字の値なので、デフォルト値としてNULLにすることはできません(代わりに '+'と ' - ')。さて、もし私がXAMLでそれらを設定すると、一時的に相互に等しい(例外がスローされる)pre-initとなる可能性があります...しかし、初期化後に私は彼らの平等を正しくチェックすることができます...問題はデザイナーがコントロールを初期化していないことです。私はちょうどデザイナー固有のコードを活用しなければならないと思う。 –

0
public MyView() 
     { 
      if (DesignerProperties.GetIsInDesignMode(this))           
       return; 

      InitializeComponent();    
     } 
関連する問題