2016-04-28 8 views
0

Ich bin extrem neu, WP8 in C# zu entwickeln. Ich versuche, eine einfache App zu schreiben, die Daten von einer Webseite abruft, und dann eine TextBlock kontinuierlich aktualisieren, möglicherweise jede Sekunde.Wie Daten von einer Webseite abgerufen und in Xaml kontinuierlich in Windows Phone 8 angezeigt werden?

Momentan kann ich Daten von der Webseite abrufen, aber TextBlock kann ich nicht aktualisieren, obwohl ich INotifyPropertyChanged verwendet habe. Die TextBlock wird nur einmal beim Start der Anwendung aktualisiert.

Die cs-Datei von MachineData:

public class MachineData : INotifyPropertyChanged 
{ 
    public string CurrentValue 
    { 
     get 
     { 
      return _currentValue; 
     } 
     set 
     { 
      _currentValue = value; 
      NotifyPropertyChanged("CurrentValue"); 
     } 
    } 
    private string _currentValue; 

    public event PropertyChangedEventHandler PropertyChanged; 
    private void NotifyPropertyChanged(string propertyName) 
    { 
     PropertyChangedEventHandler handler = PropertyChanged; 
     if (handler != null) 
     { 
      handler(this, new PropertyChangedEventArgs(propertyName)); 
     } 
    } 
} 

Hier ist der Code, den ich für das Abrufen von Daten verwendet:

foreach (MachineData md in Items) 
{ 
    var wc = new WebClient(); 
    wc.DownloadStringCompleted += (sender, e) => 
    { 
     string data = (string)e.Result; 
     md.CurrentValue = data; // Update the value of machine 
     wc.DownloadStringAsync(new Uri(address)); 
    }; 
    wc.DownloadStringAsync(new Uri(address)); 
} 

XAML-Snippet:

<DataTemplate> 
    <StackPanel Margin="0,0,0,17"> 
     <TextBlock Text="{Binding CurrentValue}" TextWrapping="Wrap" Style="{StaticResource PhoneTextExtraLargeStyle}"/> 
    </StackPanel> 
</DataTemplate> 
+0

U muss möglicherweise 'md.CurrentValue = data; // Aktualisiere den Wert von machine im UI-Thread –

Antwort

0

Ich gehe davon aus Sie verwenden einige Liste wie Steuerelement, wie ListBox, GridView, etc ...

Was Sie tun müssen, ist Ihre Items an ItemSource an die Steuerung zu binden, dann erhalten Sie ein Update.

Ich sehe derzeit nicht, wie Sie die MachineData an ein Steuerelement binden, so dass meine erste Schätzung ist, warum es für Sie nicht funktioniert.

Hier ist ein Arbeitscode.

XAML:

<Grid Background="White"> 
    <ListBox x:Name="MyListBox"> 
     <ListBox.ItemTemplate> 
      <DataTemplate> 
      <StackPanel Margin="0,0,0,17"> 
       <TextBlock Text="{Binding CurrentValue}" TextWrapping="Wrap"/> 
       <Button Click="Button_Click">click</Button> 
      </StackPanel> 
      </DataTemplate> 
     </ListBox.ItemTemplate> 
    </ListBox> 
</Grid> 

-Code hinter:

public sealed partial class MainPage : Page 
{ 
    List<MachineData> Items = new List<MachineData>(); 

    public MainPage() 
    { 
     this.InitializeComponent(); 
     if (System.Diagnostics.Debugger.IsAttached) 
     { 
      Application.Current.DebugSettings.EnableFrameRateCounter = false; 
     } 

     Items.Add(new MachineData()); 

     MyListBox.ItemsSource = Items; 
    } 

    private void Button_Click(object sender, RoutedEventArgs e) 
    { 
     foreach (MachineData md in Items) 
     { 
      md.CurrentValue = "Update Text"; 
     } 
    } 
} 

Hier wird, wenn Sie die Taste drücken, wird die MachineData Set mit "Text aktualisieren" und Sie sollten den Text Update sehen.