【问题标题】:Silverlight Windows Phone Databinding -- noob questionSilverlight Windows Phone 数据绑定——菜鸟问题
【发布时间】:2026-01-05 16:30:01
【问题描述】:

我有一个基本的 Windows Phone List 应用程序,在 MainViewModel 类中有这样的代码

// CODE THAT WORKS --

Items.Clear();

foreach (var itm in e.Result)
    Items.Add(itm);

Count = Items.Count;

// CODE THAT DOES NOT WORK -- I'm trying to understand WHY

Items = e.Result;

数据绑定 Xaml 如下所示:

<DataTemplate>
    <StackPanel x:Name="DataTemplateStackPanel" Orientation="Horizontal">
        <Image x:Name="ItemImage" Source="/AppName;component/Images/ArrowImg.png" Height="43" Width="43" VerticalAlignment="Top" Margin="10,0,20,0"/>
        <StackPanel>
            <TextBlock x:Name="ItemText" Text="Event Name" Margin="-2,-13,0,0" Style="{StaticResource PhoneTextExtraLargeStyle}"/>
            <TextBlock x:Name="DetailsText" Text="{Binding Path=Description}" Margin="0,-6,0,3" Style="{StaticResource PhoneTextSubtleStyle}"/>
        </StackPanel>
    </StackPanel>
</DataTemplate>

我认为我对 ObservableCollection 和 INotifyPropertyChanged 的​​工作方式存在误解,因为我认为这段代码应该可以工作。与我的 INotifyPropertyChanged 实现一样,与 NonCollection 项目的数据绑定工作正常。

【问题讨论】:

    标签: .net wpf silverlight data-binding windows-phone-7


    【解决方案1】:

    虽然您没有包含 Items 属性的代码 sn-p,但我猜问题是您在修改属性的值时没有触发 PropertyChanged 事件(即,将引用更改为另一个目的)。 如果你想保留不起作用的代码,你应该像这样实现 Items 属性:

    private IEnumerable<Item> items;
    
    public IEnumerable<Item> Items
      {
          get { return this.items; }
          set
          {
              this.items = value;
              // Call OnPropertyChanged whenever the property is updated
              OnPropertyChanged("Items");
          }
      }
    
      protected void OnPropertyChanged(string name)
      {
          PropertyChangedEventHandler handler = PropertyChanged;
          if (handler != null)
          {
              handler(this, new PropertyChangedEventArgs(name));
          }
      }
    

    使用此实现,您不需要将 Items 集合设为 ObservableCollection,但每次您想要修改它(添加或删除项目)时,都应该完全替换它。

    当然,您可以将类型保留为 ObservableCollection 而不是 IEnumerable,但要考虑到这种集合相对于 List 或 Array 等其他集合的开销。

    【讨论】:

    • 这非常正确,本质上 ObservableCollection 通知绑定关于集合的更改,这就是第一个代码起作用的原因。如果您想更换收藏品,您需要如上所述的 INPC。我更喜欢前者,因为它可以使代码更简洁(带有一些替换的扩展方法)
    • 有趣,我使用的是内置示例,它使用“自动属性”样式定义。我没有想到将其更改为使用 INPC。谢谢!
    • 我认为 ObservableCollection 的东西在他们第一次使用时就已经咬了每个人......