2016-11-09 39 views
0

ビュー(XAML)のコントロールにアタッチする依存関係プロパティを使用してビヘイビアクラスを作成しました。私はMVVMを使用しているので、ViewModelのプロパティにバインドしてこの添付プロパティを設定する必要がありますが、設定されません。ここで私は何をしたいの簡易版である:UWPでのバインドで添付のビヘイビアプロパティが設定されていません

行動クラス:

public static class TestBehavior 
{ 
    public static readonly DependencyProperty SomeStringProperty = 
     DependencyProperty.Register("SomeString", typeof(string), typeof(TestBehavior), new PropertyMetadata("")); 

    public static string GetSomeString(DependencyObject o) 
    { 
     return (string)o.GetValue(SomeStringProperty); 
    } 

    public static void SetSomeString(DependencyObject o, string value) 
    { 
     o.SetValue(SomeStringProperty, value); 
    } 

} 

XAML:

<TextBlock Text="{Binding ViewModelProperty}" local:TestBehavior.SomeString="{Binding ViewModelProperty}" /> 

のTextBlockの "テキスト" プロパティは、正しくバインドビヘイビアの "SomeString"プロパティはそうではありません。

興味深いことに、ビヘイビアプロパティを値に設定すると、そのプロパティが設定されます。例:

<TextBlock Text="{Binding TestValue}" local:TestBehavior.SomeString="Foo" /> <!-- This Works --> 

動作プロパティへのバインディングが機能しない理由はありますか?

答えて

1

添付ファイルの動作にはどのような影響がありますか?

GetSomeString/SetSomeStringメソッドでブレークポイントを設定して、接続プロパティが動作していないかどうかを確認していますか?その場合は、バインディングを使用するときにGet/Setメソッドが呼び出されないため、バインディングでは機能しません。

バインディング経由であるかどうかにかかわらず、添付プロパティが変更された場合に反応する場合は、Registerコールで指定されたPropertyMetadataPropertyChangedCallbackを使用します。

+0

これはまさに私が(ブレークポイントを使って)したことです。私はコールバックメソッドを追加し、それはバインディングで実行されます。バインディングを使用してGet/Setメソッドが実行されない理由は何ですか? –

+2

これは、バインディングインフラストラクチャが依存プロパティ(通常または添付)を使用して動作する方法です。私はそれが内部最適化の何らかの形だと信じています。 – ibebbs

+0

また、 'GetSomeString'メソッドはコードがプロパティにアクセスしやすくするための一般的なパターンにすぎないとも思います。プラットフォームは、バインドするときに値を設定するだけです。 –

関連する問題