1

Je développe une application de magasin Windows.Application de magasin C#: Mise à jour d'un ListView

J'ai

class User 
{ 
    public string Login { get; set; } 
    public string Name { get; set; } 
    public string Enabled { get; set; } 

    public User(string Login) 
    { 
     this.Login = Login; 
     this.Load(); 
    } 

    async public Task Load() 
    { 
     HttpResponseMessage response = await App.http.GetAsync("https://example.com/user?login=" + Login); 
     var xml = XDocument.Parse(await response.Content.ReadAsStringAsync()); 
     var user = (from entry in xml.Descendants("user") 
         select new 
         { 
          Name  = (string)entry.Element("name"), 
          Enabled = (string)entry.Element("enabled") 
         }).First(); 
     this.Name = user.Name; 
     this.Enabled = user.Enabled; 
    } 
} 

qui décrit l'utilisateur et charge toutes les données de manière asynchrone à partir du serveur. J'ai aussi MainPage.xaml avec le code suivant derrière:

public sealed partial class MainPage : Mail.Common.LayoutAwarePage 
{   
    ObservableCollection<User> Users = new ObservableCollection<User>(); 

    public MainPage() 
    { 
     this.InitializeComponent();    
     itemListView.ItemsSource = Users; 
    } 

    private async void pageRoot_Loaded(object sender, RoutedEventArgs e) 
    { 
     HttpResponseMessage response = await App.http.GetAsync("https://example.com/listusers"); 
     var xml = XDocument.Parse(await response.Content.ReadAsStringAsync()); 
     foreach (var item in from entry in xml.Descendants("email") 
          select new 
          { 
           Login = (string)entry.Element("name") 
          }) 
     { 
      Users.Add(new User(item.Login)); 
     } 
    } 
} 

MainPage a une ListView qui Prèsentoir ObservableCollection<User> Users. (J'ai DataTemplate qui ressemble à:

 <DataTemplate x:Key="UserTemplate"> 
     <StackPanel Orientation="Horizontal" Width="470" Height="85"> 
      <Border Height="40" Width="40" Margin="10,10,0,10" VerticalAlignment="Top"> 
       <Image Source="/SampleImage.png" Stretch="UniformToFill"/> 
      </Border> 
      <StackPanel Orientation="Vertical" VerticalAlignment="Top" Margin="0,10,0,0"> 
       <TextBlock Text="{Binding Login}" FontSize="20" FontWeight="Semilight" 
        Margin="10,0,0,0" Width="320" Height="26" TextTrimming="WordEllipsis" 
        HorizontalAlignment="Left" VerticalAlignment="Top"/> 
       <TextBlock Text="{Binding Name}" 
        Margin="10,2,0,0" Width="320" TextTrimming="WordEllipsis" TextWrapping="Wrap" 
        HorizontalAlignment="Left"/> 
      </StackPanel> 
      <TextBlock Text="{Binding Enabled}" FontSize="16" Margin="20,0,0,0" VerticalAlignment="Center"/> 
     </StackPanel> 
    </DataTemplate> 

).

Malheureusement, Je ne vois que les données initiales (connexions) dans la liste. Toutes les autres données qui sont reçues de manière asynchrone dans le constructeur (name, enabled) ne sont pas affichées dans le listview (je suis sûr, il est chargé correctement). Comment puis-je faire ListView pour afficher l'état actuel des objets dans la collection Users? Ou dois-je effectuer des requêtes synchrones (comment?)

+3

Votre classe '' user' doit mettre en œuvre INotifyPropertyChanged' et augmenter les notifications de modification de la propriété correctement. –

+0

Pourriez-vous s'il vous plaît donner un exemple? – simon

+0

@HighCore Ok, cela a fonctionné, merci !!! Vous pouvez poster ceci comme réponse, et je le marquerai comme une solution. – simon

Répondre

1

Votre classe d'utilisateur doit implémenter INotifyPropertyChanged et déclencher correctement les notifications de modification de propriété.

- HighCore

(Cette question avait besoin d'une réponse à être convenablement marqué comme "une réponse".)