Свойство привязки Xamarin не найдено

#c# #xaml #xamarin #xamarin.forms #xamarin.android

#c# #xaml #xamarin #xamarin.forms #xamarin.android

Вопрос:

У меня есть представление коллекции, определенное следующим образом:

 <RefreshView 
        Command="{Binding RefreshCommand}"
        IsRefreshing="{Binding IsRefreshing}">
        <CollectionView
            ItemsSource="{Binding Menus}">
            <CollectionView.ItemTemplate>
                <DataTemplate>
                    <Grid>
                        <Grid.RowDefinitions>
                            <RowDefinition Height="32" />
                            <RowDefinition Height="128" />
                        </Grid.RowDefinitions>
                        <Grid.ColumnDefinitions>
                            <ColumnDefinition Width="*" />
                            <ColumnDefinition Width="*" />
                            <ColumnDefinition Width="*" />
                        </Grid.ColumnDefinitions>

                        <Image 
                            Source="{Binding ImageURI}"
                            HorizontalOptions="FillAndExpand"
                            VerticalOptions="FillAndExpand" 
                            Aspect="AspectFill"
                            Opacity="0.64"
                            Grid.RowSpan="2"
                            Grid.ColumnSpan="3"/>

                        <Label 
                            Text="{Binding Name}"
                            FontAttributes="Bold"
                            FontSize="Large"
                            TextColor="Black"
                            Grid.Row="0"
                            Grid.ColumnSpan="3"/>

                        <Label 
                            Text="{Binding Description}"
                            FontSize="Body" 
                            TextColor="Black"
                            Grid.Row="1"
                            Grid.ColumnSpan="3"/>
                    </Grid>
                </DataTemplate>
            </CollectionView.ItemTemplate>
        </CollectionView>
    </RefreshView>
 

Но при сборке в представлении ничего не отображается, и консоль показывает следующие ошибки:

 [0:] Binding: 'ImageURI' property not found on '<model>', target property: 'Xamarin.Forms.Image.Source'
[0:] Binding: 'Name' property not found on '<model>', target property: 'Xamarin.Forms.Label.Text'
[0:] Binding: 'Description' property not found on '<model>', target property: 'Xamarin.Forms.Label.Text'
 

Когда я меняю представление на это:

         <Label Text="{Binding Menus.Count}"
               TextColor="Black"/>

        <Label Text="{Binding Menus[0]}"
               TextColor="Black"/>

        <Label Text="{Binding Menus[0].Name}"
               TextColor="Black"/>
 

Результат выглядит следующим образом, но по-прежнему выдает то же сообщение об ошибке.

 [0:] Binding: 'Name' property not found on 'hollywood.Models.MenuHandle', target property: 'Xamarin.Forms.Label.Text'
 

скриншот

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

 public class MenuListViewModel : BaseViewModel
    {
        public MenuListViewModel()
        {
            //RefreshMenus();
            Menus.Add(new MenuHandle { Name = "Test", Description="test2"});
            Title = "Menu";
        }

        public async Task RefreshMenus()
        {
            IsRefreshing = true;
            TimeSpan age = DateTime.Now - MenusAge;
            if (age.TotalSeconds > 1)
            {
                try
                {
                    Menus = await App.ApiConnection.GetMenusAsync();
                    MenusAge = DateTime.Now;
                }
                catch { }
            }
            IsRefreshing = false;
        }

        ObservableCollection<MenuHandle> menus = new ObservableCollection<MenuHandle>();
        public ObservableCollection<MenuHandle> Menus
        {
            get { return menus; }
            private set { SetProperty(ref menus, value); }
        }

        bool isRefreshing;
        public bool IsRefreshing
        {
            get { return isRefreshing; }
            private set { SetProperty(ref isRefreshing, value); }
        }

        DateTime MenusAge = DateTime.MinValue;

        public ICommand RefreshCommand => new Command(async () => await RefreshMenus());
    }
}
 

Класс модели:

 public class MenuHandle
    {
        [JsonProperty("name")]
        public string Name;
        [JsonProperty("url_name")]
        public string URLName;
        [JsonProperty("description")]
        public string Description;
        [JsonProperty("image")]
        public Uri ImageURI;
    }
 

Любые предложения будут с благодарностью приняты.

Комментарии:

1. Возможно, вам нужно объявить их как свойства с помощью get; set в MenuHandle: public string Name { get; set; }

Ответ №1:

Вам нужно объявить свои переменные как свойства, потому что привязки работают со свойствами:

 public class MenuHandle
    {
        [JsonProperty("name")]
        public string Name { get; set; }
        [JsonProperty("url_name")]
        public string URLName  { get; set; }
        [JsonProperty("description")]
        public string Description  { get; set; }
        [JsonProperty("image")]
        public Uri ImageURI  { get; set; }
    }