すべてが Windows Phone 7.1 開発環境で行われます。
MainPage.xaml には ListBox があります。
<ListBox x:Name="LottoListBox" ItemsSource="{Binding lottoResults}">
<ListBox.ItemTemplate>
<DataTemplate>
<Grid>
<local:LottoResults Date="{Binding Date}" Results="{Binding Results}" />
</Grid>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
ご覧のとおり、ItemSource として「lottoResults」コレクションを設定しています。
public ObservableCollection<Lotto> lottoResults { get; set; }
「ロト」クラス:
public DateTime Date
{
get { return _date; }
set
{
_date = value;
NotifyPropertyChanged("Date");
}
}
private DateTime _date;
public Structures.DoubleResult[] Results
{
get { return _results; }
set
{
_results = value;
NotifyPropertyChanged("Results");
}
}
private Structures.DoubleResult[] _results;
public event PropertyChangedEventHandler PropertyChanged;
private void NotifyPropertyChanged(string propertyName = "")
{
if(PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}
DoubleResult 構造には int と bool の 2 つのフィールドが含まれていますが、「Results」フィールドへのバインディングを設定していないため、現時点では重要ではありません。
私のユーザーコントロール「LottoResults」を見てみましょう:
public DateTime Date
{
get { return (DateTime)GetValue(DateProperty); }
set { SetValue(DateProperty, value); }
}
public static readonly DependencyProperty DateProperty =
DependencyProperty.Register("Date", typeof(DateTime), typeof(LottoResults), new PropertyMetadata(new DateTime(), dateChanged));
public static void dateChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
LottoResults control = d as LottoResults;
MessageBox.Show("DateChanged!");
// some magical, irrelevant voodoo which only I can understand. ;-)
}
そして、「Date」フィールドをバインドするいくつかの XAML です。
<TextBlock Grid.ColumnSpan="6" Foreground="Black" FontSize="34" FontWeight="Bold" Text="{Binding Date, StringFormat='{}{0:yyyy.MM.dd}'}" />
そして驚き、驚き - バインドが機能しません。まあ、ユーザーコントロールではそうです。デフォルト値として DependencyProperty に「new DateTime()」を設定しました。これは 0001.01.01 であり、まさにそれが TextBlock に表示されています。
私のlottoResultsコレクション(ListBoxのItemsSource)には3つのアイテムがあります(日付が「0001.01.01」のアイテムはありません)。また、ListBox には 3 つの項目が表示されますが、表示される日付は常に 0001.01.01 です。さらに、「dateChanged()」メソッドが実行されることはありません (MessageBox が取得されず、ブレークポイントで停止することもありません)。そのため、「Date」フィールドがバインディングから新しい値を受け取ることはないと思います。
しかし興味深いことに、TextBlock のコードを usercontrol から MainPage.xaml にコピーすると (つまり、「lottoResults」コレクションから直接値を取得するようになりました)、バインドが機能します。
<ListBox x:Name="LottoListBox" ItemsSource="{Binding lottoResults}">
<ListBox.ItemTemplate>
<DataTemplate>
<Grid>
<TextBlock Foreground="Black" FontSize="34" FontWeight="Bold" Text="{Binding Date, StringFormat='{}{0:yyyy.MM.dd}'}" />
</Grid>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
それで、それはなぜですか?私は行き止まりにいます。これを理解するために半日を費やしましたが、結果はありませんでした。