#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; }
}