Xamarin формы: скрыть элемент Flowlistview, включая его пространство от пользовательского интерфейса, на основе строкового значения - PullRequest
0 голосов
/ 19 января 2019

Я использую flowlistview для отображения изображений.Мне нужно скрыть изображение, если значение pageStatus равно OFF, и показать изображение, если значение pageStatus равно ON.Я попробовал, как показано ниже:

В модели:

public string pageStatus { get; set; }
public bool pictureStatus
        {
            get
            {
                if (pageStatus == "OFF")
                    return false;
                else
                    return true;
            }
        }

В XAML добавлено IsVisible="{Binding pictureStatus}" для изображения .Изображения не отображаются в пользовательском интерфейсе, но отображаются пустые места для OFF изображений состояния, как показано ниже.

enter image description here

Мне нужно удалитьэтот пробел также из пользовательского интерфейса, как я могу это сделать?

Ответы [ 3 ]

0 голосов
/ 19 января 2019

Вы можете использовать IValueConverter easiliy:

XAML:

Определить ресурс

xmlns:converter="clr-namespace:ConverterNamespace" 

   <flowlistview.Resources>
      <ResourceDictionary>
           <converter:VisibilityConverter x:Key="VisibilityConverter" />
      </ResourceDictionary>     
   </flowlistview.Resources>

Binding

IsVisible="{Binding pageStatus, Converter={StaticResource VisibilityConverter}}"

Класс преобразователя:

public class VisibilityConverter: IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {    
            if ((string)value == "ON" || (string)value != null)
                return true;
            else
                return false;    
        }

        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
        {
            throw new NotImplementedException();
        }    
    }

https://docs.microsoft.com/en-us/xamarin/xamarin-forms/app-fundamentals/data-binding/converters

Если вы хотите изменить значение свойства позже и уведомить о просмотре списка, вам нужно использовать INotifyPropertyChanged, как описано выше.

В вашей модели:

 public class ModelClass : INotifyPropertyChanged
    {
        string _pagestatus;
        public string pageStatus
        {
            get
            {
                return _pagestatus;
            }
            set
            {
                _pagestatus = value;
                OnPropertyChanged();
            }
        }

    public event PropertyChangedEventHandler PropertyChanged;
    public void OnPropertyChanged([CallerMemberName] string propName = null)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propName));
    }
}

https://docs.microsoft.com/tr-tr/dotnet/api/system.componentmodel.inotifypropertychanged?view=netframework-4.7.2

0 голосов
/ 01 февраля 2019

Вам следует отфильтровать исходные данные перед привязкой к источнику элементов представления списка.Когда вы обнаружите, что его значение включено, добавьте его в ваш конечный источник предметов.Я изменяю ваш код в вашей PhotoGalleryViewModel как:

HttpClient client = new HttpClient();
var Response = await client.GetAsync("REST API");
if (Response.IsSuccessStatusCode)
{
    string response = await Response.Content.ReadAsStringAsync();
    PhotoAlbum photoAlbum = new PhotoAlbum();
    List<PhotoList> dataList = new List<PhotoList>();
    if (response != "")
    {
        photoAlbum = JsonConvert.DeserializeObject<PhotoAlbum>(response.ToString());
        foreach (var photos in photoAlbum.photoList)
        {
            if (!Items.Contains(photos))
            {
                Items.Add(photos);
            }

            // Instead of using primitive data, filter it here
            if (photos.pageStatus == "ON")
            {
                dataList.Add(photos);
            }
        }

        AllItems = new ObservableCollection<PhotoList>(dataList);
        await Task.Delay(TimeSpan.FromSeconds(1));
        UserDialogs.Instance.HideLoading();
    }
    else
    {
        UserDialogs.Instance.HideLoading();
        if (Utility.IsIOSDevice())
        {
            await Application.Current.MainPage.DisplayAlert("Alert", "Something went wrong, please try again later.", "Ok");
        }
        else
        {
            ShowAlert("Something went wrong, please try again later.");
        }
    }
}
else
{
    UserDialogs.Instance.HideLoading();
    if (Utility.IsIOSDevice())
    {
        await Application.Current.MainPage.DisplayAlert("Alert", "Something went wrong at the server, please try again later.", "Ok");
    }
    else
    {
        ShowAlert("Something went wrong at the server, please try again later.");
    }
}
0 голосов
/ 19 января 2019

У вас есть две опции: либо вы полностью удаляете элемент из ListView ItemsSource, либо внедрите в своей модели представления измененный INotifyProperty, чтобы изменить видимость каждого элемента. Вот небольшой образец.

using System;
using System.ComponentModel;
using Xamarin.Forms;

namespace YourNameSpace
{
    public class YourViewModel : INotifyPropertyChanged
    {
        private string _pageStatus;
        private bool _pictureStatus;
        public event PropertyChangedEventHandler PropertyChanged;

        public string PageStatus
        {
            set
            {
                if (_pageStatus != value)
                {
                    _pageStatus = value;
                    if(_pageStatus.equals("OFF))
                    {
                        PictureStatus = false;
                    }
                    else
                    {
                        PictureStatus = true;
                    }
                    OnPropertyChanged("PageStatus");
                }
            }
            get
            {
                return _pageStatus;
            }
        }

        public bool PictureStatus
        {
            set
            {
                if (_pictureStatus != value)
                {
                    _pictureStatus = value;
                    OnPropertyChanged("PictureStatus");
                }
            }
            get
            {
                return _pictureStatus;
            }
        }



        protected virtual void OnPropertyChanged(string propertyName)
        {
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
        }
    }
}

Затем в XAML

IsVisible="{Binding PictureStatus}"
...