首页 > 解决方案 > 将属性绑定到列表视图

问题描述

我有一个天气 VM,可以完美地获取我的城市和国家代码,但我正在尝试将其余数据绑定到 XAML。我所有的数据都存储在数组中,由于某种原因,当我循环时,变量 i 不会增加并且应用程序崩溃。

我也有icon的问题,我有一个list,就是我的Listview的itemsource,但是Icon在另一个数组上

我试图循环,并分配每个变量,循环总是崩溃

            var splitedData = cityData.Split(",");
            var city = splitedData[0];
            var conutryCode = splitedData[1];

            var data = await WeatherAPI.GetWeatherDataAsync(city, conutryCode);
            if (data != null) {
                for (int i = 0; i < data.list.Count; i++) {
                    rootObject.list[i].dt_txt = data.list[i].dt_txt;
                    rootObject.list[i].main.temp_max = data.list[i].main.temp_max;
                    rootObject.list[i].main.temp_min = data.list[i].main.temp_min;
                    rootObject.list[i].weather[i].icon
                }
            }
        }

xml 列表视图

                  Margin="20" ItemsSource="{Binding rootObject.list}">
            <ListView.ItemTemplate>
                <DataTemplate>
                    <RelativePanel>
                        <TextBlock x:Name="dateTB"
                                   Text="{Binding dt_txt}"
                                   RelativePanel.RightOf="iconTB"
                                   RelativePanel.AlignTopWith="iconTB" />
                        <TextBlock x:Name="highTB"
                                   Text="{Binding main.temp_max}"
                                   RelativePanel.RightOf="iconTB"
                                   RelativePanel.Below="dateTB"
                                   FontSize="10" />
                        <TextBlock x:Name="lowTB"
                                   RelativePanel.RightOf="highTB"
                                   RelativePanel.Below="dateTB"
                                   FontSize="10"
                                   Text="{Binding main.temp_min}"
                                   Margin="10,0,0,0" />
                        <Image x:Name="iconTB"
                               Source="{}"
                               Height="30"
                               Width="30"
                              />
                    </RelativePanel>
                </DataTemplate>
            </ListView.ItemTemplate>

        </ListView>

我预计日期会出现,最高价会出现,最低价会出现。

另外我不知道如何绑定图标,因为图标在 Weather,而不是 RootObject 列表中,这是我列表的 itemsource

标签: xamlmvvmuwp

解决方案


我在我身边尝试了你的代码,发现可能是原因。问题可能是您没有为主要对象或天气列表或日期列表创建实例。因此,您将值分配给 null 然后它会给出错误。

我稍微改了一下,你可以在你身边试试。(我还是不能用MapLocator.GetCityData();所以我没有用真实数据尝试过。)

    public class RootObject : Notify
{
    private List<Day> _list;
    public List<Day> list
    {
        get { return _list; }
        set
        {
            if (value != _list)
            {
                _list = value;
                onPropertyChanged("list");
            }
        }
    }
    public RootObject()
    {
        //I added five objects for test. In real scenario, the count depends on the data number you get
        list = new List<Day>();
        list.Add(new Day());
        list.Add(new Day());
        list.Add(new Day());
        list.Add(new Day());
        list.Add(new Day());
    }
}

public class Day : Notify
{
    private Main _main;
    public Main main
    {
        get { return _main; }
        set
        {
            if (value != _main)
            {
                _main = value;
                onPropertyChanged("main");
            }
        }
    }

    private List<Weather> _weather;
    public List<Weather> weather
    {
        get { return _weather; }
        set
        {
            if (value != _weather)
            {
                _weather = value;
                onPropertyChanged("weather");
            }
        }
    }

    private string _dt_txt;
    public string dt_txt
    {
        get { return _dt_txt; }
        set
        {
            if (value != _dt_txt)
            {
                _dt_txt = value;
                onPropertyChanged("dt_txt");
            }
        }
    }
    public Day()
    {
        main = new Main();
        //I added five objects for test. In real scenario, the count depends on the data number you get
        weather = new List<Weather>();
        weather.Add(new Weather());
        weather.Add(new Weather());
        weather.Add(new Weather());
        weather.Add(new Weather());
        weather.Add(new Weather());
    }

}

对于本地测试,我只添加了 5 个对象。在您的真实场景中,您需要检查来自 bingmap 的数据计数。


推荐阅读