Данные не являются обязательными в формах Xamarin Listview group - PullRequest
0 голосов
/ 16 сентября 2018

Я использую вид списка Группировка в формах Xamarin, но некоторые данные не являются обязательными.Я использую последнюю версию Xamarin Forms 3.1.Мой код:

<ListView ItemsSource="{Binding FacilityList}"
      IsGroupingEnabled="true" HasUnevenRows="True" ItemTapped="OnItemTapped">
            <ListView.GroupHeaderTemplate>
                <DataTemplate>
                    <ViewCell>
                        <Label Text="{Binding Heading}" TextColor="Black" FontSize="Medium" />
                    </ViewCell>
                </DataTemplate>
            </ListView.GroupHeaderTemplate>

            <ListView.ItemTemplate>
                <DataTemplate>
                    <ViewCell>
                        <StackLayout>
                            <Image Source="{Binding ImageName}" HeightRequest="50" WidthRequest="50"/>
                            <Label Text="{Binding Name}" TextColor="Black" FontSize="Medium"/>
                        </StackLayout>
                    </ViewCell>
                </DataTemplate>
            </ListView.ItemTemplate>
        </ListView>

И моя модель просмотра

 private ObservableCollection<FacilitiesGroup> facilityList;
    public ObservableCollection<FacilitiesGroup> FacilityList
    {
        get => facilityList;
        set => SetProperty(ref facilityList, value);
    }

    private Facility selectedItem;
    public Facility SelectedItem
    {
        get => selectedItem;
        set
        {
            SetProperty(ref selectedItem, value);
        }
    }

    public ICommand ItemTappedCommand { get; set; }

    public FacilityViewModel()
    {
        FacilityDataStore facilityDataStore = new FacilityDataStore();
        var items = facilityDataStore.GetList();
        var groupList = new List<FacilitiesGroup>();
        var group = new FacilitiesGroup()
        {
            Facilities = items.Where(x => x.IsSubscribed == true).ToList(),
            Heading = "Subscribed"
        };
        var group2 = new FacilitiesGroup()
        {
            Facilities = items.Where(x => x.IsSubscribed == false).ToList(),
            Heading = "Unsubscribed"
        };
        groupList.Add(group);
        groupList.Add(group2);
        FacilityList = new ObservableCollection<FacilitiesGroup>(groupList);
    }

Код класса FacilityGroup:

public class FacilitiesGroup
{
    public List<Facility> Facilities { get; set; }
    public string Heading { get; set; }
}

И класс объекта:

public class Facility
{
    [PrimaryKey, AutoIncrement]
    public int ID { get; set; }

    public string Name { get; set; }
    public bool IsSubscribed { get; set; }
    public string ImageName { get; set; }
}

Я связываю данные как:

public MainPage()
    {
        InitializeComponent();
        BindingContext = new FacilityViewModel();
    }

Я не понимаю, что не так с моим кодом.Любая помощь будет оценена.Спасибо.

Ответы [ 2 ]

0 голосов
/ 19 сентября 2018

Извините за задержку ответа. Я нашел этот образец , это может быть полезно

Отказ от ответственности : Я не очень хорошо наблюдаю границы ViewModel / Model. Я просто пытаюсь выяснить, что не работает. Вам необходимо обновить ViewModels / Models в соответствии с вашими требованиями и проектными документами.

Я не думаю, что заголовок группы - это то, что вы ищете. вот ссылка на документацию Xamarin , где говорится о верхнем / нижнем колонтитуле и имеется изображение

Начнем с просмотра списка 1-го. Удалите GroupHeaderTemplate и добавьте атрибут GroupDisplayBinding в представление списка.

<ListView ItemsSource="{Binding FacilityList}"
      IsGroupingEnabled="true" 
      HasUnevenRows="True"           
      GroupDisplayBinding="{Binding Heading}" <---------
      ItemTapped="OnItemTapped">    
            <ListView.ItemTemplate>
                <DataTemplate>
                    <ViewCell>
                        <StackLayout>
                            <Image Source="{Binding ImageName}" HeightRequest="50" WidthRequest="50"/>
                            <Label Text="{Binding Name}" TextColor="Black" FontSize="Medium"/>
                        </StackLayout>
                    </ViewCell>
                </DataTemplate>
            </ListView.ItemTemplate>
        </ListView>

Как только вы сделаете это изменение, если вы запустите приложение. Вы должны увидеть два пункта в списке. Подписка / Отписался. Прогресс!

Далее нам нужно изменить модель FacilitiesGroup. Нам нужно расширить ObservableCollection.

public class FacilitiesGroup : ObservableCollection<Facility>
{
    public string Heading { get; set; }
}

Далее нам нужно внести изменения в FacilityViewModel

public FacilityViewModel()
{
    FacilityDataStore facilityDataStore = new FacilityDataStore();
    var items = facilityDataStore.GetList();
    var groupList = new List<FacilitiesGroup>();
    var group = new FacilitiesGroup()
    {
        Heading = "Subscribed"
    };

    foreach( Facility facility in items.Where(x => x.IsSubscribed == true ) )
    {
        group.Add(facility);
    }

    var group2 = new FacilitiesGroup()
    {
        Heading = "Unsubscribed"
    };

    foreach( Facility facility in items.Where(x => x.IsSubscribed == false ) )
    {
        group2.Add(facility);
    }

    groupList.Add(group);
    groupList.Add(group2);
    FacilityList = new ObservableCollection<FacilitiesGroup>(groupList);
}

Надеюсь, это поможет! Удачи.

0 голосов
/ 17 сентября 2018

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

<ListView x:Name="FacilityListview"
  IsGroupingEnabled="true" HasUnevenRows="True" ItemTapped="OnItemTapped">
        <ListView.GroupHeaderTemplate>
            <DataTemplate>
                <ViewCell>
                    <Label Text="{Binding Heading}" TextColor="Black" FontSize="Medium" />
                </ViewCell>
            </DataTemplate>
        </ListView.GroupHeaderTemplate>

        <ListView.ItemTemplate>
            <DataTemplate>
                <ViewCell>
                    <StackLayout>
                        <Image Source="{Binding ImageName}" HeightRequest="50" WidthRequest="50"/>
                        <Label Text="{Binding Name}" TextColor="Black" FontSize="Medium"/>
                    </StackLayout>
                </ViewCell>
            </DataTemplate>
        </ListView.ItemTemplate>
    </ListView>

Теперь назначьте FacilityList как itemsSource ниже в контроллере.

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