2014-02-22 119 views
0

我一直在試圖讓這個工作,但我仍然沒有運氣..基本上我使用一個ObservableColletion加載我所有的項目到一個自定義ItemTemplate的列表框。ObservableCollection不通過INotifyPropertyChanged更新

這是我的列表框XAML:

<DataTemplate x:Key="DataTemplate1"> 
     <Grid d:DesignWidth="431" d:DesignHeight="109.333" Height="109.333" Width="431"> 
      <toolkit:ContextMenuService.ContextMenu> 
       <toolkit:ContextMenu IsFadeEnabled="True" IsZoomEnabled="False"> 
        <toolkit:MenuItem Header="Delete" Click="Delete_Click"/> 
       </toolkit:ContextMenu> 
      </toolkit:ContextMenuService.ContextMenu> 
      <Button x:Name="callPerson" Tag="{Binding ItemNumber}" Content="CALL" HorizontalAlignment="Left" Margin="-6,12,0,0" VerticalAlignment="Top" Click="callPerson_Click"/> 
      <Grid toolkit:TiltEffect.IsTiltEnabled="True" Margin="0,-1,-121,-3"> 
       <TextBlock Text="{Binding ItemBody}" HorizontalAlignment="Left" VerticalAlignment="Top" Height="26" Width="387" FontSize="19" Margin="109,62,0,0" FontFamily="Segoe WP" TextTrimming="WordEllipsis"> 
        <TextBlock.Foreground> 
         <SolidColorBrush Color="{StaticResource PhoneTextMidContrastColor}"/> 
        </TextBlock.Foreground> 
       </TextBlock> 
       <TextBlock Text="{Binding FolderID}" HorizontalAlignment="Left" TextWrapping="Wrap" VerticalAlignment="Top" Height="34" Width="496" FontSize="24" Margin="0,72,0,0" Visibility="Collapsed"/> 
       <TextBlock Text="{Binding ItemNumber}" HorizontalAlignment="Left" VerticalAlignment="Top" Height="28" Width="387" FontSize="21" Margin="109,34,0,0" FontFamily="Segoe WP"/> 
       <TextBlock Text="{Binding ItemTitle}" HorizontalAlignment="Left" VerticalAlignment="Top" Height="37" Width="387" FontSize="28" FontFamily="Segoe WP" Margin="109,0,0,0"/> 
      </Grid> 
     </Grid> 
    </DataTemplate> 

我用XAML到我的列表框綁定,如:ItemsSource = "{Binding}"

這裏是我的INotifyPropertyChanged的:

public class Items : INotifyPropertyChanged 
    { 
     private string _ItemTitle; 
     public string ItemTitle 
     { 
      get { return _ItemTitle; } 
      set 
      { 
       _ItemTitle = value; 
       RaisePropertyChangedForItemTitle("ItemTitle"); 
      } 
     } 
     private string _ItemBody; 
     public string ItemBody 
     { 
      get { return _ItemBody; } 
      set 
      { 
       _ItemBody = value; 
       RaisePropertyChangedForItemBody("ItemBody"); 
      } 
     } 
     private string _FolderID; 
     public string FolderID 
     { 
      get { return _FolderID; } 
      set 
      { 
       _FolderID = value; 
       RaisePropertyChangedForItemFolderID("FolderID"); 
      } 
     } 
     private string _ItemNumber; 
     public string ItemNumber 
     { 
      get { return _ItemNumber; } 
      set 
      { 
       _ItemNumber = value; 
       RaisePropertyChangedForItemNumber("ItemNumber"); 
      } 
     } 

     public event PropertyChangedEventHandler ItemTitleChanged; 
     public void RaisePropertyChangedForItemTitle(string ItemTitle) 
     { 
      PropertyChangedEventHandler handler = ItemTitleChanged; 
      if (handler != null) handler(this, new PropertyChangedEventArgs(ItemTitle)); 
     } 
     public event PropertyChangedEventHandler ItemBodyChanged; 
     public void RaisePropertyChangedForItemBody(string ItemBody) 
     { 
      PropertyChangedEventHandler handler = ItemBodyChanged; 
      if (handler != null) handler(this, new PropertyChangedEventArgs(ItemBody)); 
     } 
     public event PropertyChangedEventHandler FolderIDChanged; 
     public void RaisePropertyChangedForItemFolderID(string FolderID) 
     { 
      PropertyChangedEventHandler handler = FolderIDChanged; 
      if (handler != null) handler(this, new PropertyChangedEventArgs(FolderID)); 
     } 
     public event PropertyChangedEventHandler ItemNumberChanged; 
     public void RaisePropertyChangedForItemNumber(string ItemNumber) 
     { 
      PropertyChangedEventHandler handler = ItemNumberChanged; 
      if (handler != null) handler(this, new PropertyChangedEventArgs(ItemNumber)); 
     } 
    } 

這是ObservableCollection:

public class AddItems : ObservableCollection<Items> 
    { 
     IsolatedStorageFile store = IsolatedStorageFile.GetUserStoreForApplication(); 
     public AddItems() 
     { 
      string directory = "/GetItems"; 
      string[] filenames = store.GetDirectoryNames(directory); 
      foreach (string filename in filenames) 
      { 
       IsolatedStorageFileStream openName = store.OpenFile("/GetItems/contactName.txt", FileMode.Open, FileAccess.Read); 
       IsolatedStorageFileStream openNumber = store.OpenFile("/GetItems/contactNumber.txt", FileMode.Open, FileAccess.Read); 
       IsolatedStorageFileStream openFolderID = store.OpenFile("/GetItems/FolderID.txt", FileMode.Open, FileAccess.Read); 
       IsolatedStorageFileStream openNotes = store.OpenFile("/GetItems/contactNotes.txt", FileMode.Open, FileAccess.Read); 

       using (StreamReader readContactName = new StreamReader(openName)) 
       { 
        var contactName = readContactName.ReadLine(); 
        using (StreamReader readContactNumber = new StreamReader(openNumber)) 
        { 
         var contactNumber = readContactNumber.ReadLine(); 
         using (StreamReader ReadFolderID = new StreamReader(openFolderID)) 
         { 
          var FolderID = ReadFolderID.ReadLine(); 
          using (StreamReader ReadContactNotes = new StreamReader(openNotes)) 
          { 
           var contactNotes = ReadContactNotes.ReadLine(); 
           Add(new Items() { ItemTitle = contactName, ItemBody = contactNotes, FolderID = FolderID, ItemNumber = contactNumber }); 
          } 
         } 
        } 
       } 
      } 
     } 

這是我如何將我的項目加載到列表框中:listBox.DataContext = collections.LoadItems;我已將我的INotifyPropertyChanged和ObservableCollection添加到名爲Collections.cs的不同的類文件中,因此Collections.LoadItems。

現在我啓動應用程序,項目將加載。我點擊一個項目,然後我去編輯它,並保存內容,然後返回主頁面,列表框將顯示舊內容。現在,爲了獲得編輯後的新內容,我必須關閉應用程序並重新啓動它,並以這種方式向我顯示新內容。

這是不正確的,因爲INotifyPropertyChanged應該自動更改項目值等等,並顯示最新的內容。如果有人可以請幫我解決這個問題,因爲我真的很無能。不知道我是否做得對。

非常感謝! 謝謝!

回答

2

使用INotifyPropertyChanged的模式與您使用的模式不同。而不必爲每個屬性的單個事件,但只是一個提高,以適應任何屬性更改事件:

public class Items : INotifyPropertyChanged 
{ 
    // all property changes use this event 
    public event PropertyChangedEventHandler PropertyChanged; 
    private string _ItemTitle; 

    // one property as an example: 
    public string ItemTitle 
    { 
     get { return _ItemTitle; } 
     set 
     { 
      _ItemTitle = value; 
      // by using the CallerMemberName attribute 
      // you can skip passing the specific property name 
      // as it's added automatically 
      RaisePropertyChanged(); 
     } 
    } 

    private void RaisePropertyChanged([CallerMemberName] String propertyName = "") 
    { 
     if (PropertyChanged != null) 
     { 
      PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
     } 
    }     
} 

必須有比你所展示的,因爲你的類就不會編譯如沒有更多的代碼活動聲明PropertyChanged

public event PropertyChangedEventHandler PropertyChanged; 
+0

謝謝。我已經實現了你給我的代碼,但似乎每當我回到主頁時,它仍然顯示舊的內容,直到我重新啓動應用程序。什麼可能是錯的?我有一種感覺,它需要將項目重新加載到列表框中? –

+0

你可以檢查輸出/調試控制檯,看看是否有任何綁定錯誤? – WiredPrairie

+0

沒有綁定錯誤。如果我保存了任何內容,它會將所有項目正確加載到ListBox中。 –

相關問題