2017-06-09 10 views
0

WindowTitleプロパティをこのWindowのカスタムプロパティにバインドしようとしています。 XAMLは次のようになります。このような背景にあるカスタムプロパティにバインドコントロール/ウィンドウプロパティを設定し、既定値を設定します

Title="{Binding Path=WindowTitle, RelativeSource={RelativeSource Mode=Self}}" 

コード:

public string WindowTitle 
{ 
    get 
    { 
     string title = (string)GetValue(WindowTitleProperty); 
     title = string.IsNullOrEmpty(title) ? "Editor" : title; 
     return title; 
    } 

    set 
    { 
     SetValue(WindowTitleProperty, value); 
    } 
} 

public static readonly DependencyProperty WindowTitleProperty = 
      DependencyProperty.Register("WindowTitle", typeof(string), typeof(Editor), new UIPropertyMetadata(null)); 

プロパティWindowTitleが新しい値に設定した後にこれは良い作品。しかし残念ながら、ロード時にWindow私はタイトルを取得していません。 WindowTitleのゲッターは呼び出されません。私が言う限り、それは決して呼ばれることはありません。私は間違って何をしていますか? getterが(タイトルが正しく設定されている場合でも)呼び出されないのはなぜですか?他の方法でデフォルト値を設定することはできますか?

+0

[WPF:XAMLプロパティ宣言がSetters経由で設定されていない可能性がありますか?](https://stackoverflow.com/questions/3836076/wpf-xaml-property-declarations-not-being-set-via-setters) – dymanoid

+0

参照される質問はセッター(ゲッタではない)に関するものですが、理由は同じです。その答えをお読みください。 – dymanoid

+0

詳細な説明は、[XAMLの読み込みと依存関係のプロパティ](https://docs.microsoft.com/en-us/dotnet/framework/wpf/advanced/xaml-loading-and-dependency-properties)を参照してください。 – Clemens

答えて

2

あなたの不動産は奇妙に見えます。なぜそれが依存関係プロパティとして定義されていますか? CLRプロパティを使用してINotifyPropertyChangedインターフェイスを実装することもできます。これは私のために正常に動作します:

public partial class Window13 : Window, INotifyPropertyChanged 
{ 
    public Window13() 
    { 
     InitializeComponent(); 
    } 

    private string _windowTitle = "default title..."; 
    public string WindowTitle 
    { 
     get { return _windowTitle; } 
     set { _windowTitle = value; NotifyPropertyChanged(); } 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 
    private void NotifyPropertyChanged([CallerMemberName] String propertyName = "") 
    { 
     if (PropertyChanged != null) 
     { 
      PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
     } 
    } 
} 

依存関係プロパティのCLRゲッターはGetValueメソッドを呼び出すと、他のロジックを含めるべきではありません。

編集:あなたには、いくつかの理由で依存関係プロパティを希望した場合は 、それは次のように実装する必要があります:あなたはプロパティを登録する際にデフォルト値を指定し

public string WindowTitle 
{ 
    get 
    { 
     return (string)GetValue(WindowTitleProperty); 
    } 

    set 
    { 
     SetValue(WindowTitleProperty, value); 
    } 
} 

public static readonly DependencyProperty WindowTitleProperty = 
      DependencyProperty.Register("WindowTitle", typeof(string), typeof(Editor), new UIPropertyMetadata("Editor")); 

注意。

+0

デフォルト値を設定することは私にとっては欠けていた部分でした。何かを学ぶだけです: 'INotifyPropertyChanged'をウィンドウに実装するのは良い習慣ですか? –

+0

本当に。通常は、ウィンドウのDataContextをINotifyPropertyChangedを実装したビューモデルクラスに設定し、ビューモデルのプロパティにバインドします。しかし、ウィンドウを含むどのクラスもINotifyPropertyChangedを実装することができます。 – mm8

+0

このウィンドウでは、私のMainWindowと同じViewModelを使用します。私はそのViewModelのいくつかのコンポーネントにアクセスする必要がありますが、MainWindow以外のWindowsからのものを入れたくありません。私は、MainWindow ViewModelへのアクセスを持つchildformのための別個のViewModelを実装する必要があると思います。ご協力いただきありがとうございます! –

関連する問題