2012-02-12 30 views
1

Stringプロパティに明示的なアクセサを追加しないと、データバインディングが機能しません。何故ですか? ここでは、テキストボックスをStringプロパティにフックする簡単な例を示します。データバインディングソースに明示的なゲッターが必要なのはなぜですか?

MainPage.xamlを:

<Grid Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0"> 
    <TextBlock Text="{Binding Message} /> 
</Grid> 

そして、背後にあるコード:

public String Message; 

public MainPage() 
{ 
    InitializeComponent(); 
    Message = "Hello World"; 
    DataContext = this; 
} 

これは動作しませんが、テキストボックスが空です。

ただし、プロパティアクセサを追加してください。

public String Message { get; set; }; 

これで動作します。

これは、MSDN Data Bindingで説明されています。誰か説明できますか?プロパティにimplic set/get accessorsがありませんか?それでも、なぜデータバインディングでプロパティにアクセスできないのですか?

おかげで、

答えて

3
public String Message; 

これはフィールドであり、プロパティではありません。 getterとsetterを追加すると、自動プロパティが作成されます。 プロパティのみがバインドできます。

+0

@Slaks、@devdigital、@Matti_Virkkunen:あなたはすべて同じ答えを持っていますが、それはすべて正確ではないことが分かります。あなたはすべて、フィールドとプロパティの違いを私に明確にしました。そして、それは私に正しい答えに導いた:バインディングは、パスが関わっているときにプロパティ**でしか動かない**そうでなければ、フィールドに直接アクセスすることができる。例:上記は 'DataContext = Message;'であり、 'は動作します!したがって、パスを使用するにはアクセサが必要です。 [MSDN](http://msdn.microsoft.com/en-us/library/system.windows.data.binding.source(v = vs95).aspx) – peterept

2

{ get; set; }は、コンパイラは、これらの暗黙のアクセサを生成するものです。それを残しておくと、プロパティを作成するのではなく、簡単なフィールドを作成することになります。

私はそれほど多くのXAMLを使っているわけではありませんので、確かに言えませんが、単純なフィールドへのバインディングをサポートしていない可能性があります。

2

public String Message;は、プロパティではなくフィールドです。
データバインドはプロパティでのみ機能します。

関連する問題