如何自定义显示在Xamarin Forms列表's ViewCell中的数据?

本文关键字:ViewCell 数据 显示 自定义 Xamarin 列表 Forms | 更新日期: 2023-09-27 18:06:46

我正在尝试定制ListViewViewCell。我希望根据每个项目源中的a值显示一张图片。

如果这个人是男性,那么展示一张男性的照片。否则为雌性。

public class Person
{
    string Name;
    Gender Gender;
    string SecretNumber;
}

如果是Gender == GenderType.Male则显示male.png。else female.png .

最后是SecretNumber。我希望用*替换所有的字符,除了最后3个。

如何在ViewCell类中完成这种类型的自定义?

public PersonViewCell : ViewCell
{ ... }

如何自定义显示在Xamarin Forms列表's ViewCell中的数据?

一个可能的解决方案是在您的Person类中添加另一个属性:

private ImageSource image
{
   get
   {
      if (Gender == Gender.Male)
      {
         return ImageSource.FromFile("Male.png")
      }
      else if (Gender == Gender.Female)
      {
         return ImageSource.FromFile("Female.png")
      }
   }
}

然后绑定到ViewCell中,比如:

<Image Source="{Binding image}"/>

但是如果你想更进一步,而不仅仅是一个图像,并根据这个属性重新设计整个ViewCell,我建议看看这里使用的DataTemplateSelector

我必须补充一点,在代码中处理跨平台图像时,使用这个静态助手类可能也很有用:

public static class ImageSourceHelper
{
    public static string CrossPlatformImage(string resource)
    {
        return Device.OnPlatform(string.Concat("resources", resource), resource, string.Concat("resources", resource));
    }
}

,你可以这样使用:

     return ImageSource.FromFile(ImageSourceHelper.CrossPlatformImage("Male.png"))

另一个可能的解决方案是重写OnBindingContextChanged方法:

public class PersonViewCell : ViewCell
{
    Image image;
    public PersonViewCell()
    {
        image = new Image();
    }
    protected override void OnBindingContextChanged()
    {
        base.OnBindingContextChanged();
        var person = BindingContext as Person;
        image.Source = person.Gender == GenderType.Male ? "Male.png" : "Feale.png";
    }
}

我建议使用IValueConverter,一个实现接口的类。

的例子:

public class GenderToImageConverter : IValueConverter
{
    public object Convert(object value, object parameter, CultureInfo cultureInfo)
   {
        Gender gender = (Gender)value;
        if(gender == Gender.Female)
            return "male.png";
        else
            return "female.png";
   }
}