簡體   English   中英

Silverlight Windows Phone數據綁定-noob問題

[英]Silverlight Windows Phone Databinding — noob question

我有一個基本的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的工作方式有誤解,因為我認為這段代碼應該工作。 數據綁定到NonCollection項目的工作與我的INotifyPropertyChanged實現所期望的一樣。

盡管您尚未包括Items屬性的代碼段,但我想問題是您在修改屬性值(即更改對另一個對象的引用)時沒有觸發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等其他類型的開銷。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM