2015-09-13 13 views
6

Sono abbastanza nuovo in C# e provo a sviluppare l'app UWP di Windows 10 come un progetto per hobby.C# XAML: l'interfaccia utente non si aggiorna dopo aver modificato un'istanza di ObservableCollection

Parte della MainBrowser.XAML

  <GridView x:Name="browserPane" ItemsSource="{x:Bind fileInCurrentFolderList,Mode=OneWay}" SelectionChanged="browserPane_SelectionChanged" Margin="0,48,0,0"> 
       <GridView.ItemTemplate> 
        <DataTemplate x:DataType="classes:Item"> 
         <StackPanel Margin="10"> 
          <Image Height="268" Width="200" Source="{x:Bind Thumbnail}" x:Phase="1" Stretch="UniformToFill"></Image> 
          <TextBlock Width="200" Text="{x:Bind Caption}" TextWrapping="Wrap" TextTrimming="CharacterEllipsis" MaxLines="2"/> 
         </StackPanel> 
        </DataTemplate> 
       </GridView.ItemTemplate> 
      </GridView> 

Questa visualizzazione a griglia è legano a

public sealed partial class MainBrowser : Page 
{ 
... 
private ObservableCollection<Item> fileInCurrentFolderListUI = new ObservableCollection<Item>(); 
... 
} 

C'è un elenco di pulsante sul lato sinistro della app. Ogni pulsante chiamerà un metodo che restituirà un ObservableCollection<Item> indietro.

Il problema è che ho bisogno di fare qualcosa di simile

foreach (Item file in ReturnObservableCollection) 
    { 
    fileInCurrentFolderList.Add(item); 
    } 

Invece di questo

fileInCurrentFolderList = ReturnObservableCollection; 

Per poter attivare l'aggiornamento nell'interfaccia utente. Come posso cambiarlo?

risposta

7

Che cosa sta succedendo è che ObservableCollection sta segnalando quando gli articoli vengono aggiunti o rimossi da esso, ma se la raccolta stessa cambia (vale a dire una nuova istanza viene istanziata) non c'è nulla da segnalare la modifica. Una soluzione è utilizzare l'interfaccia INotifyPropertyChanged nel tuo ViewModel e segnalare le modifiche alle proprietà.

public sealed partial class MainBrowser : Page, INotifyPropertyChanged 
{ 
    // Backing field. 
    private ObservableCollection<Item> fileInCurrentFolderListUI; 
    // Property. 
    public ObservableCollection<Item> FileInCurrentFolderListUI 
    { 
     get { return fileInCurrentFolderListUI; } 
     set 
     { 
      if (value != fileInCurrentFolderListUI) 
      { 
       fileInCurrentFolderListUI = value; 
       // Notify of the change. 
       NotifyPropertyChanged(); 
      } 
     } 
    } 

    // PropertyChanged event. 
    public event PropertyChangedEventHandler PropertyChanged; 

    // PropertyChanged event triggering method. 
    private void NotifyPropertyChanged([CallerMemberName] String propertyName = "") 
    { 
     if (PropertyChanged != null) 
     { 
      PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
     } 
    } 
} 

È possibile inizializzare il campo supporto nella dichiarazione, come hai fatto prima o subito inizializzare la proprietà nel costruttore. Assicurati di legarti alla proprietà e non al campo di supporto. Inoltre, se si intende assegnare un nuovo oggetto, assicurarsi di farlo alla proprietà, in modo che la modifica possa essere trasmessa. Fondamentalmente, non interagire con il campo di supporto, basta fare tutto attraverso la proprietà.

+2

Grazie! Ora funziona come dovrebbe essere. – Suttisak

+1

@Suttisak Prego. –

+1

@ B.K. Uso fantastico di CallerMemberName. Ho sempre passato il valore del nome utente chiamante, e questo lo rende molto più elegante! Grazie! – RAB

Problemi correlati