2016-11-24 6 views
-1

Я пытаюсь работать с api openweathermap (прогноз на 5 дней). Я сгенерировал JSON в C# код, который выглядит следующим образом:Привязать свойство списка к элементу ListView

[DataContract] 
public class Main 
{ 
    [DataMember] 
    public double temp { get; set; } 
    [DataMember] 
    public double temp_min { get; set; } 
    [DataMember] 
    public double temp_max { get; set; } 
    [DataMember] 
    public double pressure { get; set; } 
    [DataMember] 
    public double sea_level { get; set; } 
    [DataMember] 
    public double grnd_level { get; set; } 
    [DataMember] 
    public int humidity { get; set; } 
    [DataMember] 
    public double temp_kf { get; set; } 
} 

[DataContract] 
public class Weather 
{ 
    [DataMember] 
    public int id { get; set; } 
    [DataMember] 
    public string main { get; set; } 
    [DataMember] 
    public string description { get; set; } 
    [DataMember] 
    public string icon { get; set; } 
} 

[DataContract] 
public class Clouds 
{ 
    [DataMember] 
    public int all { get; set; } 
} 

[DataContract] 
public class Wind 
{ 
    [DataMember] 
    public double speed { get; set; } 
    [DataMember] 
    public double deg { get; set; } 
} 

[DataContract] 
public class Sys2 
{ 
    [DataMember] 
    public string pod { get; set; } 
} 

/*public class Rain 
{ 
    public double __invalid_name__3h { get; set; } 
}*/ 

[DataContract] 
public class List 
{ 
    [DataMember] 
    public int dt { get; set; } 
    [DataMember] 
    public Main main { get; set; } 
    [DataMember] 
    public List<Weather> weather { get; set; } 
    [DataMember] 
    public Clouds clouds { get; set; } 
    [DataMember] 
    public Wind wind { get; set; } 
    [DataMember] 
    public Sys2 sys { get; set; } 
    [DataMember] 
    public string dt_txt { get; set; } 
    //public Rain rain { get; set; } 
} 

[DataContract] 
public class RootObject 
{ 
    [DataMember] 
    public City city { get; set; } 
    [DataMember] 
    public string cod { get; set; } 
    [DataMember] 
    public double message { get; set; } 
    [DataMember] 
    public int cnt { get; set; } 
    [DataMember] 
    public List<List> list { get; set; } 
} 

Тогда после того, как у меня RootObject который содержит все данные прогноза я пытаюсь связать список первых десяти температурах в ListView.

EDIT:

public sealed partial class MainPage : Page 
{ 

    private List<double> TemperatureObjects; 
    private ObservableCollection<RootObject> WeatherObjects; 

Моя XAML выглядит следующим образом:

<ListView Grid.Row="2" ItemsSource="{x:Bind WeatherObjects}"> 
     <ListView.ItemTemplate> 
      <DataTemplate x:DataType="local:RootObject"> 
       <StackPanel Orientation="Vertical"> 
        <TextBlock> 
         <Run Text="{x:Bind Temp}"/> 
         <Run Text="&#xE00BA;"/> 
        </TextBlock> 

       </StackPanel> 
      </DataTemplate> 
     </ListView.ItemTemplate> 
    </ListView> 

Можете ли вы показать мне некоторую помощь для этой проблемы? благодаря

+0

Просьба показать код, ответственный за привязку и настройку datacontext, указать, были ли вы использованы общедоступные свойства и INotifyPropertyChanged. В противном случае ваш вопрос слишком широк. – Romasz

+0

Связывание работает с общедоступными свойствами, поэтому вам нужно изменить строку, по крайней мере, на 'public ObservableCollection WeatherObjects {get; set;};' также ваш MainPage должен реализовать INotifyPropertyChanges, и вы должны выполнить событие RaisePropertyChanged после установки свойств. – Romasz

+0

Хорошо. Спасибо, я сделаю это – axcelenator

ответ

1

А теперь я вижу, по крайней мере, три вещи, которые вы должны исправить:

  • реализовать INotifyPropertyChanged в вашем MainPage, например так:

    public partial class MainPage: Page, INotifyPropertyChanged 
    { 
        public event PropertyChangedEventHandler PropertyChanged; 
    
        private void RaiseProperty(string name) => PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(name)); 
    
  • ваши объекты, которые связывают должны быть общедоступными:

    private ObservableCollection<RootObject> weatherObjects; 
    
    public ObservableCollection<RootObject> WeatherObjects 
    { 
        get { return weatherObjects; } 
        set { weatherObjects= value; RaiseProperty(nameof(WeatherObjects)); } 
    } 
    
  • в зависимости от вашего кода, вы можете также изменить режим привязки по умолчанию от -х одноразовая:

    <ListView Grid.Row="2" ItemsSource="{x:Bind WeatherObjects, Mode="OneWay"}"> 
    

Вам не нужно устанавливать DataContext как вы используете x:Bind.

Смежные вопросы