将对象的List属性绑定到ListView

时间:2016-11-24 09:17:48

标签: c# xaml data-binding uwp

我尝试使用openweathermap api(5天预测)。我已经生成了json到C#代码,如下所示:

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

编辑:

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>
你可以告诉我一些关于这个问题的帮助吗?感谢

1 个答案:

答案 0 :(得分:1)

至于现在,我发现至少需要纠正三件事:

  • 在您的MainPage中实现INotifyPropertyChanged,例如:

    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)); }
    }
    
  • 根据您的代码,您可能还需要从默认的 OneTime 更改绑定模式:

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

您不需要像使用x:Bind一样设置 DataContext

相关问题