Я думаю, что есть проблема с вашим геттером и сеттером.Это не правильно обновляет значение после его изменения.Я сделал с помощью INotifyPropertyChanged
, и он работает нормально.
MainPage.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:local="clr-namespace:App"
x:Class="App.MainPage">
<ContentPage.Content>
<ScrollView HorizontalOptions="FillAndExpand">
<StackLayout
HorizontalOptions="FillAndExpand"
BackgroundColor="Transparent"
BindableLayout.ItemsSource="{Binding CategoriesList}">
<BindableLayout.ItemTemplate>
<DataTemplate>
<StackLayout
Orientation="Horizontal"
HeightRequest="150"
HorizontalOptions="FillAndExpand">
<Button
Text="{Binding Name}" />
</StackLayout>
</DataTemplate>
</BindableLayout.ItemTemplate>
</StackLayout>
</ScrollView>
</ContentPage.Content>
</ContentPage>
MainPage.xaml.cs:
namespace App
{
public partial class MainPage : ContentPage
{
public MainPage()
{
InitializeComponent();
BindingContext = new MainPageViewModel();
}
}
}
MainPageViewModel:
public class MainPageViewModel : BaseViewModel
{
private ObservableCollection<CategoriesModel> _Categories;
public ObservableCollection<CategoriesModel> CategoriesList
{
get
{
return this._Categories;
}
set
{
if (_Categories != value)
{
this._Categories = value;
SetPropertyValue(ref _Categories, value);
}
}
}
public MainPageViewModel()
{
CategoriesList = new ObservableCollection<CategoriesModel>
{
new CategoriesModel() { Name = "Data 1", ID = "1" },
new CategoriesModel() { Name = "Data 2", ID = "2" },
new CategoriesModel() { Name = "Data 3", ID = "3" },
new CategoriesModel() { Name = "Data 4", ID = "4" },
new CategoriesModel() { Name = "Data 5", ID = "5" },
new CategoriesModel() { Name = "Data 6", ID = "6" },
new CategoriesModel() { Name = "Data 7", ID = "7" }
};
}
}
Моя BaseViewModel, которая расширяет INotifyPropertyChanged:
public class BaseViewModel : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
protected void OnPropertyChanges([CallerMemberName] string propertyName = null)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
protected void SetPropertyValue<T>(ref T bakingFiled, T value, [CallerMemberName] string proertyName = null)
{
bakingFiled = value;
OnPropertyChanges(proertyName);
}
}
Всекласс модели представления расширяет BaseViewModel для доступа к методу SetPropertyValue()
.
Вывод: