Я пишу приложение с прогнозом погоды, и я не могу привязать свойство объекта в ListView.

Коллекция состоит из объектов WeatherModel, у которых есть строковое свойство «Температура».

Xaml видит коллекцию и выводит ее, но не может найти свойство объекта «Температура».

Как привязать свойство «Температура»?

Это мой XAML

<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             xmlns:d="http://xamarin.com/schemas/2014/forms/design"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
             mc:Ignorable="d"
             x:Class="IMAP.View.Weather"
             xmlns:local="clr-namespace:IMap.ViewModel;assembly=IMAP">

    <ContentPage.Resources>
        <local:ForecastWeatherViewModel x:Key="vm"/>
    </ContentPage.Resources>
    <ContentPage.Content>
        <ListView ItemsSource="{Binding items, Source={StaticResource vm}}">
            <ListView.ItemTemplate>
                <DataTemplate>
                    <ViewCell>
                        <StackLayout Orientation="Horizontal" Padding="2,15">

                            <Label Text="{Binding Temperature}"/>

                        </StackLayout>
                    </ViewCell>
                </DataTemplate>
            </ListView.ItemTemplate>
        </ListView>
    </ContentPage.Content>
</ContentPage>

Это моя ViewModel

namespace IMap.ViewModel
{
    public class ForecastWeatherViewModel : ViewModel
    {
        public ObservableCollection<WeatherModel> WeatherList { get; set; }

        public ObservableCollection<WeatherModel> items
        {
            get
            {
                return WeatherList;
            }
        }



        public ForecastWeatherViewModel()
        {
            WeatherList = new ObservableCollection<WeatherModel>();

            WeatherList.Add(new WeatherModel()
                {
                    Temperature = SomeTemp
                });

            WeatherList.Add(new WeatherModel()
                {
                    Temperature = SomeTemp
                });

            OnPropertyChange();

        }
    }
}

Это моя модель

namespace IMAP.Model
{
    public class WeatherModel
    {
        public string Temperature;
    }
}
1
Skrillim 20 Сен 2020 в 20:43

1 ответ

Лучший ответ

Прежде всего, вы не можете привязываться к полям, вместо этого используйте для этой цели свойства.

public class WeatherModel
{
    public string Temperature { get; set; }
}

Затем вы можете исправить управление коллекцией в View Model. Также со следующими правилами именования: заглавная буква для свойства и строчная буква для поля. Теперь у вас есть два общедоступных свойства для одной и той же коллекции, давайте сделаем одно.

public class ForecastWeatherViewModel : ViewModel
{
    // backing field, never interact with it outside of the property getter/setter
    private ObservableCollection<WeatherModel> items;

    // public property, bind here, interact with it
    public ObservableCollection<WeatherModel> Items
    {
        get => items; // same as "get { return items; }" but shorter
        set
        {
            items = value;
            OnPropertyChange();
        }
    }

    public ForecastWeatherViewModel()
    {
        Items = new ObservableCollection<WeatherModel>();

        Items.Add(new WeatherModel()
        {
            Temperature = SomeTemp
        });

        Items.Add(new WeatherModel()
        {
            Temperature = SomeTemp
        });
    }
}
<ListView ItemsSource="{Binding Items, Source={StaticResource vm}}">
0
aepot 20 Сен 2020 в 18:33