Ich verwende flowlistview zum Auflisten von Bildern. Ich muss das Bild ausblenden, wenn der Wert pageStatus OFF ist, und das Bild anzeigen, wenn der Wert pageStatus ON ist. Ich habe es wie folgt versucht:

Im Modell:

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

In XAML wurde IsVisible="{Binding pictureStatus}" für das Bild hinzugefügt. Die Bilder werden nicht in der Benutzeroberfläche angezeigt, aber für OFF Statusbilder wie unten werden Leerzeichen angezeigt.

enter image description here

Ich muss dieses Leerzeichen auch von der Benutzeroberfläche entfernen. Wie kann ich das tun?

0
Sreejith Sree 19 Jän. 2019 im 11:49

3 Antworten

Beste Antwort

Sie sollten die Quelldaten filtern, bevor Sie sie an die Elementquelle Ihrer Listenansicht binden. Wenn Sie feststellen, dass der Wert EIN ist, fügen Sie ihn Ihrer endgültigen Elementquelle hinzu. Ich ändere Ihren Code in Ihrem PhotoGalleryViewModel wie folgt:

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.");
    }
}
1
Land Lu - MSFT 1 Feb. 2019 im 01:40

Sie können IValueConverter einfach verwenden:

XAML:

Ressource definieren

xmlns:converter="clr-namespace:ConverterNamespace" 

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

Bindung

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

Konverterklasse:

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

Wenn Sie den Eigenschaftswert später ändern und die Listenansicht benachrichtigen möchten, müssen Sie INotifyPropertyChanged wie oben beschrieben verwenden.

In Ihrem Modell:

 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

2
sermet 19 Jän. 2019 im 20:50

Sie haben zwei Möglichkeiten: Entweder Sie entfernen das Element vollständig aus der ListView ItemsSource oder Sie implementieren in Ihrem Ansichtsmodell die geänderte INotifyProperty, um die Sichtbarkeit jedes Elements zu ändern. Hier ist ein kleines Beispiel.

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

Dann in XAML

IsVisible="{Binding PictureStatus}"
1
Bruno Caceiro 19 Jän. 2019 im 12:17