【问题标题】:bind properties to a listview将属性绑定到列表视图
【发布时间】:2019-10-03 21:49:37
【问题描述】:

我有一个天气 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
                }
            }
        }

xaml 列表视图

                  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

【问题讨论】:

  • 图标存储在rootObject.list[i].weather[i].icon

标签: xaml mvvm uwp


【解决方案1】:

我在我身边尝试了您的代码,发现可能是原因。问题可能是您没有为主要对象或天气列表或日期列表创建实例。因此,您将值分配给 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 的数据计数。

【讨论】:

  • 问题是一个使用 MVVM 的 ma 并且我的 List 的 itemsource 是 rootObject.list 我不知道它是否应该是 DataContext,我在 github 上有它,如果你可以接受看看github.com/eduardoagr/MVVM_Excersice。为什么你知道什么是半交替子串
  • 我试过你的样品。调用MapLocator.GetCityData() 时总是出现异常。如果我使用在本地创建的数据,就像我在回复中所做的那样,所有数据都可以正确显示。我怀疑这个问题与从 locationmanager 获取的数据有关。
  • 当我运行应用程序时,我会回到我的当前位置,所以我只是想检索数据。也许我应该使用 itemsouce = Binding rootObject.list 而不是 datacontext = Binding rootObject.list ?到时候你能在 xaml 中定义一个 for 循环来获取图标吗
  • MapLocator.GetCityData() 中的异常可能是因为 bingMap 密钥与我的帐户相关联?
  • 可能我没说清楚。如果我不使用MapLocator.GetCityData() 获取数据,所有示例代码都可以正常工作。只需在本地创建数据,列表视图就可以显示所有绑定而无需更改任何内容。这就是为什么我认为数据或数据模型将是原因。为什么不向我分享您使用的所有课程的数据模型?
猜你喜欢
  • 1970-01-01
  • 2023-04-07
  • 2012-07-11
  • 2012-10-08
  • 1970-01-01
  • 2010-12-02
  • 2017-09-22
  • 1970-01-01
  • 2016-08-25
相关资源
最近更新 更多