2010-07-29 46 views
1

我在MainViewModel類的Silverlight的Windows Phone數據綁定 - noob問題

// 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看起來像這樣有一個基本的Windows Phone應用程序列表,用這樣的代碼:

<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是如何工作有誤解,因爲我認爲這個代碼應該工作。 Databinding NonCollection項目正如我所期望的那樣使用INotifyPropertyChanged實現。

回答

5

儘管您沒有包含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,但要考慮此類集合對List或Array等其他類型的開銷。

+1

這幾乎是正確的,本質上ObservableCollection通知綁定關於集合的變化,這就是爲什麼第一個代碼工作。如果您想要替換集合,則需要如上所述的INPC。我更喜歡前者,因爲它可以製作更乾淨的代碼(使用替換的一些擴展方法) – 2010-07-30 04:32:28

+0

有趣的是,我使用內置示例,它使用「自動屬性」樣式定義。我沒有想到將其改爲使用INPC。謝謝! – Nate 2010-07-30 13:41:35

+0

我認爲ObservableCollection的東西在第一次使用它的時候會咬人 – 2010-07-31 00:07:05