SilverlightアプリをVisualStudioで実行していると、下記のようなメッセージがVSの出力ウィンドウに表示されることがあります。
System.Windows.Data エラー: BindingExpression パス エラー: 'Name' プロパティが 'BindingErrorSample.Data' 'BindingErrorSample.Data' (HashCode=720107) に見つかりませんでした。BindingExpression: Path='Name' DataItem='BindingErrorSample.Data' (HashCode=720107); ターゲット要素は 'System.Windows.Controls.TextBox' (Name=''); ターゲット プロパティは 'Text' (型 'System.String') です。.
これは、「DataContextにセットされたインスタンスにNameプロパティが存在しないにもかかわらず、TextBoxのTextプロパティにバインディングしようとしてるよ」という趣旨のメッセージです。
この手のエラーはコンパイルエラー・警告では検出されず、実行時エラーも起きません。よって、Silverlightアプリの動作に影響はないからいいか、とも思えるのですがこまめにつぶすべきでしょう。コンパイル警告と同じく、表示されないようにした方がバグの早期発見に役立つと思います。
バインディングエラー時にバインディングしたプロパティには、BindingBaseクラスのFallbackValueプロパティの値がセットされます。
FallbackValueの既定値は null となります。
では、FallbackValueにいろいろ値をセットしてみるとどうなるのでしょうか。文字列だけではなく数値やデートタイムも試してみます。
<StackPanel x:Name="LayoutRoot"> <TextBlock Text="{Binding Path=Name, FallbackValue='fallback value'}" /> <TextBox Text="{Binding Path=Name, FallbackValue='fallback value', Mode=TwoWay}" /> <sdk:DatePicker SelectedDate="{Binding Path=Date, FallbackValue='1999/1/1', Mode=TwoWay}" /> <ComboBox SelectedIndex="{Binding Path=Index, FallbackValue='1', Mode=TwoWay}"> <ComboBoxItem Content="Item0"/> <ComboBoxItem Content="Item1"/> <ComboBoxItem Content="Item2"/> </ComboBox> </StackPanel>
コードビハインドはこんな感じです。
public partial class MainPage : UserControl { public MainPage() { InitializeComponent(); this.DataContext = new BadData(); } public class BadData { } }
実行してみると、文字列だけではなく日付などもちゃんとセットされています。
Silverlightの場合、現状の仕様ですと何に使ってよいか迷います。しかしFallbackValueプロパティというものが存在するということは覚えておいても損はないと思います。