2017-06-22 6 views
1

Ich versuche, eine Observable Collection von Objekten an eine Listenansicht zu binden. Ich habe ein Debug in das Ansichtsmodell eingefügt und es zeigt, dass die Sammlung dort ist. Aber es scheint nicht am Frontend zu sein.Bindung an ListView Xamarin From

Dies ist der XAML:

<StackLayout>  



    <ListView 
       x:Name="dataList"      
       ItemsSource="{Binding routeLabels}" > 

     <ListView.ItemTemplate> 
      <DataTemplate> 
       <TextCell Text="{Binding RouteName}"/> 
      </DataTemplate> 

     </ListView.ItemTemplate> 

    </ListView> 

</StackLayout> 

Der Code hinter:

public partial class DriverDashboardView : ContentPage 
{ 
    private DriverDashboardViewModel driverdashboardviewmodel; 


    public DriverDashboardView() 
    { 

     InitializeComponent(); 

     this.Title = "Driver's Dashboard"; 
     BindingContext = driverdashboardviewmodel = new DriverDashboardViewModel(); 

    } 

    protected async override void OnAppearing() 
    { 
     base.OnAppearing(); 
     await driverdashboardviewmodel.GetLabelInfo(); 
    } 

} 

und die Aussicht Modell:

public class DriverDashboardViewModel:BaseViewModel,INotifyPropertyChanged 
{ 


    public DriverDashboardViewModel() 
    { 


    } 

    public async Task GetLabelInfo() 
    { 
     _routelabels = await service.return_label_info(); 

    } 

    // property change handler to bind to UI 
    private ObservableCollection<RouteInfo> _routelabels; 
    public ObservableCollection<RouteInfo> routeLabels 
    { 
     get { return _routelabels; } 
     set 
     { 
      if (Equals(value, _routelabels)) return; 
      _routelabels = value; 
      OnPropertyChanged(nameof(routeLabels)); 
     } 
    } 

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

Und die RouteInfo Klasse:

public class RouteInfo 
{ 
    public string RouteName { get; set; } 
    public int Stops { get; set; } 
    public string DayOf { get; set; } 

} 

Wie ich bereits erwähnt habe, habe ich ein Debugging im View-Modell gemacht und ich kann sehen, dass die Daten da sind. Aber ich kann es nicht auf der Vorderseite sehen.

Irgendwelche Ideen?

+0

Wenn Sie entfernen Sie Ihre 'ItemTemplate' tun Sie die richtige Anzahl der Einträge in der Front sehen -Ende? Wenn ja, dann ist es ein Problem mit Ihrer Vorlage. Wenn nicht, dann klingt es wie ein Problem mit Ihrer Bindung. – Mashton

Antwort

1

Innerhalb Ihrer DriverDashboardViewModel.GetLabelInfo() Methode ordnen Sie die Ergebnisse _routelabels zu. Aber _routelabels ruft nie OnPropertyChanged() auf, die für die Änderung erforderlich ist, um der Benutzeroberfläche mitzuteilen, dass sie ihre Bindung neu bewertet.

Ich würde vorschlagen, die Ergebnisse von await service.return_label_info(); direkt zu routeLabels stattdessen zuweisen.

Aber Sie könnten auch die GetLabelInfo() Code, um die Art und Weise halten Sie es jetzt ist, und fügen Sie einfach die folgenden nach der _routelabels Zuordnung manuell ein UI-Update auf tigger: OnPropertyChanged(nameof(routeLabels));

Also zusammenfassend tun eine dieser zwei Dinge:

public async Task GetLabelInfo() { 
    routeLabels = await service.return_label_info(); 
} 

Oder:

public async Task GetLabelInfo() { 
    _routelabels = await service.return_label_info(); 
    OnPropertyChanged(nameof(routeLabels)); 
} 
+0

Das hat funktioniert! Vielen Dank! Ich werde das akzeptieren, wenn es mich lässt. – user3355961