如何自定义要在 Xamarin Forms ListItem 的 ViewCell 中显示的数据?

How can I customize the data to display in Xamarin Forms ListItem's ViewCell?

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

如果此人是男性,则显示男性照片。否则是女性。

例如

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

所以如果 Gender == GenderType.Male 那么显示 male.png。否则 female.png.

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

如何在 ViewCell class 中完成此类自定义?

例如

public PersonViewCell : ViewCell
{ ... }

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

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 使用过的 here

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

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,好吧,一个实现接口的 class。

示例:

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