【问题标题】:How can I customize the data to display in Xamarin Forms ListItem's ViewCell?如何自定义要在 Xamarin Forms ListItem 的 ViewCell 中显示的数据?
【发布时间】:2015-08-06 15:13:36
【问题描述】:

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

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

例如。

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

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

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

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

例如。

public PersonViewCell : ViewCell
{ ... }

【问题讨论】:

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


    【解决方案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 的样式,我建议您查看 DataTemplateSelectorused 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"))
    

    【讨论】:

    • 您的回答启发了我为这个ViewCell 创建一个特定的ViewCellModel,然后将其传递出去。这样,我就不会用愚蠢的 ViewCell 依赖逻辑污染我的主要 POCO。塔!
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      我建议使用 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";
         }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-05-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-08-04
        • 2017-05-07
        • 1970-01-01
        • 2019-04-20
        相关资源
        最近更新 更多