Xamarin表单:如何处理flowlistview所选项目的可见性?

Xamarin表单:如何处理flowlistview所选项目的可见性?,listview,xamarin.forms,visibility,Listview,Xamarin.forms,Visibility,我在flowlistview中有一些图像,最初只显示问号图像。点击问号图像时,真实图像将可见,而不是问号图像。我已经像下面这样做了,但问题是,当点击时,所有真实的图像都是可见的,而不是选定的图像。我只需要在问号图像下显示真实图像 XAML 最初,我设置了ImageVisibility和TopImageVisibility值,如下所示: ImageVisibility = false; TopImageVisibility = true; 点击问号图像时,我更改了这些值将此代码添加到ShowMe

我在flowlistview中有一些图像,最初只显示问号图像。点击问号图像时,真实图像将可见,而不是问号图像。我已经像下面这样做了,但问题是,当点击时,所有真实的图像都是可见的,而不是选定的图像。我只需要在问号图像下显示真实图像

XAML

最初,我设置了ImageVisibility和TopImageVisibility值,如下所示:

ImageVisibility = false;
TopImageVisibility = true;
点击问号图像时,我更改了这些值将此代码添加到ShowMemoryMatchImage上:

我只需要在问号图像下显示选定的图像,但所有图像都会显示。

原因:似乎您将同一个源绑定到listView中每个项目的图像可见性。因此,当您更改属性的值时,所有项都将同时更改

解决方案:


您应该在模型中定义属性。检查以下代码

在xaml中 在视图模型中
请问,您以前是否可以尝试添加?似乎您在listView中绑定了每个项目的相同源TopImageVisibility。@LucasZhang MSFT我很快会给您一个示例,@LucasZhang MSFT是的,我在listView中绑定了每个项目的相同源TopImageVisibility,如何仅将绑定更改为选定项?您应该在模型中定义属性。您可以使用本地静态数据创建一个示例,我将在我这边测试它。
private bool _imagevisibility = false;
public bool ImageVisibility
{
    protected set
    {
        if (_imagevisibility != value)
        {
            _imagevisibility = value;
            OnPropertyChanged("ImageVisibility");
        }
    }
    get { return _imagevisibility; }
}

private bool _topImageVisibility = false;
public bool TopImageVisibility
{
    protected set
    {
        if (_topImageVisibility != value)
        {
            _topImageVisibility = value;
            OnPropertyChanged("TopImageVisibility");
        }
    }
    get { return _topImageVisibility; }
}

public ICommand ShowMemoryMatchImage
{
    get
    {
        return new Command(async (e) =>
        {
            try
            {
                ImageVisibility = true;
                TopImageVisibility = false;
            }
            catch (Exception ex)
            {
                System.Diagnostics.Debug.WriteLine("Exception:>>" + ex);
            }
        });
    }
}
ImageVisibility = false;
TopImageVisibility = true;
ImageVisibility = true;
TopImageVisibility = false;
<ffimageloading:CachedImage 
            Grid.Row="0"
            Aspect="AspectFill"
            IsVisible="{Binding ImageVisibility}"
            Source="{Binding imageUrl, Converter={StaticResource urlJoinConverter}}">
             //...                           
</ffimageloading:CachedImage>

<Image 
         Grid.Row="0"
         Aspect="AspectFill"
         IsVisible="{Binding TopImageVisibility}"
         HorizontalOptions="FillAndExpand"
         VerticalOptions="FillAndExpand"
         Source="ic_memory_match_image.png">
         //...                               
         <Image.GestureRecognizers>
              <TapGestureRecognizer
                   Command="{Binding Path=BindingContext.ShowMemoryMatchImage,Source={x:Reference Name=MemoryMatchList}}"
                   CommandParameter="{Binding imageUrl}"
                   NumberOfTapsRequired="1" />
         </Image.GestureRecognizers>
</Image>
  public class NameMatchList : INotifyPropertyChanged
    {
        public string imageUrl { get; set; }
        public string name { get; set; }

        private Color bgColor;
        public Color BGColor
        {
            set
            {
                if (value != null)
                {
                    bgColor = value;
                    NotifyPropertyChanged();
                }
            }
            get
            {
                return bgColor;
            }
        }

        private bool _imagevisibility = false;
        public bool ImageVisibility
        {
            set
            {
                if (_imagevisibility != value)
                {
                    _imagevisibility = value;
                    NotifyPropertyChanged("ImageVisibility");
                }
            }
            get { return _imagevisibility; }
        }

        private bool _topImageVisibility = false;
        public bool TopImageVisibility
        {
             set
            {
                if (_topImageVisibility != value)
                {
                    _topImageVisibility = value;
                    NotifyPropertyChanged("TopImageVisibility");
                }
            }
            get { return _topImageVisibility; }
        }


        public NameMatchList()
        {
            ImageVisibility = false;
            TopImageVisibility = true;
        }

        public event PropertyChangedEventHandler PropertyChanged;
        private void NotifyPropertyChanged([CallerMemberName] String propertyName = "")
        {
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
        }
    }
 public ICommand ShowMemoryMatchImage
    {
        get
        {
            return new Command(async (e) =>
            {
                try
                {

                    var path = e as string;

                    foreach (NameMatchList items in NameMatchImagItems)
                    {


                        if (items.imageUrl == path)
                        {
                            items.ImageVisibility = true;
                            items.TopImageVisibility = false;
                        }
                        else
                        {
                            items.ImageVisibility = false;
                            items.TopImageVisibility = true;
                        }
                    }


                }
                catch (Exception ex)
                {
                    System.Diagnostics.Debug.WriteLine("Exception:>>" + ex);
                }
            });
        }
    }