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

时间:2015-08-06 15:13:37

标签: c# data-binding xamarin xamarin-forms

我尝试自定义ListView ViewCell。我希望根据每个项目来源中的值显示图片。

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

例如

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

因此,如果Gender == GenderType.Male,则显示male.png。否则female.png

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

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

例如

public PersonViewCell : ViewCell
{ ... }

3 个答案:

答案 0 :(得分:1)

一种可能的解决方案是在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使用here

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

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"))

答案 1 :(得分:1)

另一种可能的解决方案是覆盖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";
    }
}

答案 2 :(得分:0)

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

示例:

{{1}}