Привязка данных к стеку скроллвью в формах Xamarin - PullRequest
1 голос
/ 27 марта 2019

Я видел статью о формах ксамарина с некоторой «привязываемой любовью» https://blog.xamarin.com/xamarin-forms-3-5-a-little-bindable-love/.

Я хотел попробовать и создать список прокрутки, но по какой-то причине данные, которые я связываю, не кажутсяпоявляться в представлении.Привязка должна работать нормально, потому что в моем XAML я связываю множество других вещей, и она работает успешно, но по какой-то причине эта конкретная привязка не работает.

XAML:

<ScrollView>
   <StackLayout BackgroundColor="Transparent" BindableLayout.ItemsSource="{Binding CategoriesList}"  >
                <BindableLayout.ItemTemplate>
                        <DataTemplate>         
                           <StackLayout Orientation = "Horizontal" HeightRequest="150" WidthRequest="80">

                                <Button Text="{Binding Name}" />

                         </StackLayout>
                       </DataTemplate>
                </BindableLayout.ItemTemplate>          
             </StackLayout>
        </ScrollView>

Этокак выглядит мой список в виртуальной машине:

private ObservableCollection<Categories> _Categories;
    public ObservableCollection<Categories> CategoriesList
    {
        get
        {
            return this._Categories;
        }
        set
        {
            if (_Categories != value)
            {
                this._Categories = value;
                RaisePropertyChanged("CategoriesList");
            }
        }
    }

И когда я создаю для него данные:

        CategoriesList = new ObservableCollection<Categories>();

        CategoriesList.Add(new Categories() { Name = "Data 1", ID = "1" });
        CategoriesList.Add(new Categories() { Name = "Data 2", ID = "2" });
        CategoriesList.Add(new Categories() { Name = "Data 3", ID = "3" });

1 Ответ

2 голосов
/ 28 марта 2019

Я думаю, что есть проблема с вашим геттером и сеттером.Это не правильно обновляет значение после его изменения.Я сделал с помощью 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().

Вывод:

OutPut

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...