0

一切都发生在 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,但现在它并不重要,因为我没有对“结果”字段设置任何绑定。

让我们看看我的用户控件“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. ;-)
}

现在是一些 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()”方法永远不会被执行(我没有得到消息框,也没有在断点处停止),所以我猜“日期”字段永远不会从绑定中接收到新值。

但有趣的是,如果我将 TextBlock 的代码从用户控件复制到 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>

那么,这是为什么呢?我在死胡同。我花了半天的时间来解决这个问题,但没有任何结果。

4

1 回答 1

0

Lotto 类需要实现 INotifyPropertyChanged这将导致 UI/View 在 Lotto 对象属性更改时发出信号。

如果结果集合发生变化(添加、删除项目),您也需要在那里使用 ObservableCollection 而不是数组。

于 2012-08-18T19:49:35.183 回答