2015-09-13 17 views
6

C# 'da oldukça yeniyim ve bir hobi projesi olarak Windows 10 UWP uygulamasını geliştirmeye çalışıyorum. MainBrowser.XAMLC# XAML: UI Gözlemlenebilir bir örneği değiştirdikten sonra UI güncelleştirilemiyor.

  <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> 

Bu ızgara görünümü

Parça uygulama sol tarafındaki düğme bir listesi vardır

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

bağlamak olduğunu. Her bir düğme, bir ObservableCollection<Item> geri dönecek bir yöntem çağırır.

Sorun Yerine arayüzünde güncelleştirme tetiklemek mümkün için bu

fileInCurrentFolderList = ReturnObservableCollection; 

ait

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

böyle bir şey yapmak gerekir olduğunu. Bunu nasıl değiştirebilirim?

cevap

7

Neler oluyor? ObservableCollection, öğeler eklendiğinde veya çıkarıldığında raporlanıyor, ancak koleksiyonun kendisi değişiyorsa (yani yeni bir örnek başlatılırsa) değişikliği bildirecek hiçbir şey yoktur. Bir çözüm, INotifyPropertyChanged arayüzünü ViewModel'unuzda kullanmak ve değişikliklerin özelliklerini bildirmektir. ya da sadece yapıcı tesise başlatmak için önce yaptığınız gibi

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)); 
     } 
    } 
} 

Sen bildiriminde destek alanını başlatabilir. Sadece, destek alanına değil, mülke bağlandığınızdan emin olun. Buna ek olarak, yeni bir nesne atayacaksanız, bu özelliği bunu yaptığınızdan emin olun, böylece değişiklik yayınlanabilir. Temel olarak, destek alanıyla etkileşimde bulunmayın, sadece mülk üzerinden her şeyi yapın.

+2

Teşekkür ederiz! Şimdi olması gerektiği gibi çalışıyor. – Suttisak

+1

@Suttisak Rica ederim. –

+1

@ B.K. CallerMemberName'in harika kullanımı. Her zaman üye üye isminin değerini geçtim ve bu onu çok daha şık kılıyor! Teşekkürler! – RAB