DispatcherPriority Enumは、イベントの正確な順序を思い出すのに役立ちます。
- 送信
- 通常- コンストラクターはここで実行されます
- データバインド
- 与える
- ロード済み
- バックグラウンド
- コンテキストアイドル
- アプリケーションアイドル
- システムアイドル
- 非活性
- 無効
- 入力
ご覧のとおり、最初にコンストラクターが実行され、続いてデータ バインディングが実行されます。
DependencyProperties
他のプロパティと同様に、オブジェクトが作成されたときに初期化されるため、コンストラクターが実行される前に初期化され、コンストラクターにプロパティが存在します。
DataContext
プロパティまたはその他の設定は、設定しているDependencyProperties
他のプロパティと同じように機能します。それらをバインディングで設定すると、コンストラクターの後に評価されます。XAML で設定すると、コンストラクターで設定されます。Loaded イベントでそれらを設定すると、すべてが構築、バインド、およびレンダリングされた後に設定されます。
このSOの回答も役立つかもしれません:
Window が作成されて表示されるときのイベントのシーケンス
要求に応じて、ウィンドウが作成されて表示されるときの WPF の主要なイベントのシーケンスを次に示します。
コンストラクターとゲッター/セッターは、オブジェクトが作成されるときに呼び出されます。これには、更新されるオブジェクトとそれらを継承するオブジェクトの PropertyChangedCallback、ValidationCallback などが含まれます。
各要素がビジュアル ツリーまたは論理ツリーに追加されると、その Intialized イベントが発生します。これにより、定義できる要素固有の初期化に加えて、スタイルとトリガーが適用されていることがわかります [注: 論理ツリーのリーフに対して発生しない初期化イベントルートに PresentationSource (例: Window) がない場合]
ウィンドウとその上のすべての折りたたまれていないビジュアルは測定され、各コントロールで ApplyTemplate が発生し、コンストラクターとゲッター/セッターを含む追加のオブジェクト ツリーの構築が発生します。
ウィンドウとその上のすべての折りたたまれていないビジュアルは配置されています
ウィンドウとその子孫 (論理とビジュアルの両方) が Loaded イベントを受け取る
最初に設定されたときに失敗したデータ バインディングはすべて再試行されます
ウィンドウとその子孫には、コンテンツを視覚的にレンダリングする機会が与えられます
手順 1 ~ 2 は、ウィンドウが表示されているかどうかに関係なく、ウィンドウの作成時に実行されます。他の手順は通常、ウィンドウが表示されるまで実行されませんが、手動でトリガーすると、より早く実行できます。
質問に追加されたコードに基づいて編集
あなたのDependencyProperty.Register
方法は私には面白く見えます。メソッドのシグネチャはそのメソッドのオーバーロードのいずれとも一致せず、通常のPropertyMetadataの代わりにカスタムUIProperty
クラスのように見えるものを使用してデフォルト値を設定しています。
コードが通常の署名で期待どおりに実行される場合DependencyProperty.Register
、問題の原因として考えられるのは、カスタム コード内のどこか、またはプロパティの使用/設定方法にあることを確認できます。
簡単なサンプル テストに使用したコードは次のとおりです。
public partial class UserControl1 : ContentControl
{
public UserControl1()
{
InitializeComponent();
this.TestDependencyProperty = "234";
}
public string TestDependencyProperty
{
get { return (string)GetValue(TestDependencyPropertyProperty); }
set { SetValue(TestDependencyPropertyProperty, value); }
}
public static DependencyProperty TestDependencyPropertyProperty =
DependencyProperty.Register("TestDependencyProperty", typeof(string), typeof(UserControl1),
new PropertyMetadata(null));
}
そしてXAMLは
<ContentControl x:Class="WpfApplication1.UserControl1"
x:Name="TestPanel" ...>
<Label Content="{Binding ElementName=TestPanel, Path=TestDependencyProperty}"/>
</ContentControl>