如何自定义要在 Xamarin Forms ListItem 的 ViewCell 中显示的数据?
How can I customize the data to display in Xamarin Forms ListItem's ViewCell?
我正在尝试自定义 ListView
的 ViewCell
。我希望根据每个项目源中的 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";
}
}
我正在尝试自定义 ListView
的 ViewCell
。我希望根据每个项目源中的 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";
}
}