2016-10-21 10 views
2

私はxamlの依存関係プロパティのデータバインドを試みています(そして失敗しています)。 xamlではなく、コードを使用するとうまく動作します。XAMLバインディングは依存関係プロパティで動作していませんか?

<UserControl x:Class="WpfTest.MyControl" [...]> 
    <TextBlock Text="{Binding Test}" /> 
</UserControl> 

そして、依存関係プロパティは、単純な文字列です::

ユーザーコントロールは、単に依存関係プロパティにバインドTextBlockある

public static readonly DependencyProperty TestProperty 
= DependencyProperty.Register("Test", typeof(string), typeof(MyControl), new PropertyMetadata("DEFAULT")); 

public string Test 
{ 
    get { return (string)GetValue(TestProperty); } 
    set { SetValue(TestProperty, value); } 
} 

私はいつもの実装との定期的な性質を持っていますメインウィンドウでINotifyPropertyChanged

private string _myText = "default"; 
public string MyText 
{ 
    get { return _myText; } 
    set { _myText = value; NotifyPropertyChanged(); } 
} 

これまでのところとても良いです。メインウィンドウのTextBlockにこのプロパティをバインドすると、すべて正常に動作します。 MyTextが変更され、すべてが世界でうまくいけば、テキストは正しく更新されます。

<TextBlock Text="{Binding MyText}" /> 

ただし、私がユーザーコントロールで同じことを行うと、何も起こりません。

<local:MyControl x:Name="TheControl" Test="{Binding MyText}" /> 

そして今、楽しい部分は、私がコードの中で非常に同じバインディングをしていれば機能します!

なぜxamlで動作しないのですか?

+0

さらに詳しいXAMLを表示してください。あなたが{Binding}にバインドすると、間違ったデータコンテキストにバインドしていることがわかります。 – SledgeHammer

+0

プロパティ名( "Test")をRegisterメソッドの最初のパラメータとして渡す必要があります。 Typeを最初のパラメータとして受け取るオーバーロードを見つけることができませんでした。 –

+0

MyControlのDataContextとは何ですか?それはMainWindowでなければなりません –

答えて

7

依存性宣言は、次のように見える必要があります。

public static readonly DependencyProperty TestProperty = 
    DependencyProperty.Register(
     "Test", typeof(string), typeof(MyControl), new PropertyMetadata("DEFAULT")); 

public string Test 
{ 
    get { return (string)GetValue(TestProperty); } 
    set { SetValue(TestProperty, value); } 
} 

ユーザーコントロールのXAMLでの結合、例えば、ソースオブジェクトとして制御インスタンスを設定する必要がありますバインディングのRelativeSourceプロパティを設定することにより:決して

<UserControl x:Class="WpfTest.MyControl" ...> 
    <TextBlock Text="{Binding Test, 
     RelativeSource={RelativeSource AncestorType=UserControl}}"/> 
</UserControl> 
また

非常に重要なのは、そのコンストラクタ内のUserControlのDataContextを設定します。

DataContext = this; 

UserConrolの親からのDataContextの継承を効果的に防ぐため、削除してください。あなたが明示的バインディングソースが暗黙のうちに現在のDataContextです

<local:MyControl Test="{Binding MyText}" /> 

にしながら、バインディングソースを設定している後ろのコードでバインディングでSource = DataContextを設定することにより

。しかし、そのDataContextは、UserControlのコンストラクタ内のUserControl自体への代入によって設定され、ウィンドウから継承されたDataContext(ビューモデルインスタンス)ではありません。

+0

私はそれがうまくいきませんでした。ちなみに、あなたは私の質問にあるものと同じDependencyPropertyの宣言を書いています。 – Oliver

+0

*まったく同じ*。あなたの質問では、プロパティ名( "Test")とPropertyMetadataの* new *キーワードを忘れてしまった。これらの詳細は重要です! – Clemens

+0

omg、あなたはまったく正しい!私は非常に申し訳ない。コードを間違って貼り付けたはずです。 – Oliver

関連する問題