代码之家  ›  专栏  ›  技术社区  ›  Nate CSS Guy

Silverlight Windows Phone数据绑定-noob问题

  •  1
  • Nate CSS Guy  · 技术社区  · 14 年前

    我有一个基本的Windows Phone列表应用程序,在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和InotifyPropertiesChanged的工作方式存在误解,因为我认为此代码应该工作。到非集合项的数据绑定正在使用我的inotifyPropertiesChanged实现,正如我所期望的那样工作。

    1 回复  |  直到 14 年前
        1
  •  5
  •   Anero    14 年前

    虽然您没有包含items属性的代码段,但我想问题是在修改属性值(即更改对另一个对象的引用)时,您没有触发PropertyChanged事件。 如果要保留不起作用的代码,则应实现以下项属性:

    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,但是要考虑到这种类型的集合对列表或数组等其他集合的开销。