.NET Maui CollectionView,如何仅在值存在时显示值

问题描述 投票:0回答:1

我想在对象列表中显示属性,但如果属性没有任何值,我想将其留空。

这就是我的意思:假设我有一个具有四个字符串值的对象:

object person:
string firstname
string lastname
string favoriteMovie
string favoriteBook

实际上,我有一个列表:

ObservableList<Person>
。我想使用
Person
显示 CollectionView
 以及每个 Person
中的属性,仅当该属性没有值时我想跳过它。

它可能看起来像这样:

XAML 代码看起来像这样:

<CollectionView ItemsSource={Binding People}>
   <CollectionView.ItemTemplate>
      <DataTemplate x:DataType="model:Person">
           <Frame>
               <Grid>
                   <Label Text="{Binding Name}"/>
                   <Label Text="{Binding FavoriteMovie}"/>
                   <Label Text="{Binding FavoriteBook}"/>
               ...
            ...
        ...
      ...
  </CollectionView>

我该怎么做?

注意:我正在使用 MVVM 模式,如果可能的话,我希望主要在 XAML 中执行此操作。

maui uicollectionviewcell collectionview
1个回答
0
投票

您将需要一个转换器,将空或空字符串转换为布尔值,然后您需要将其分配给您的项目的可见性,这样像下面这样的东西就可以工作,

/// <summary>
/// Inherit this for one-way converters to avoid unnecessary extra methods in each converter
/// </summary>
public abstract class BaseOneWayValueConverter : IValueConverter
{
    public abstract object Convert(object value, Type targetType, object parameter, CultureInfo culture);

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new NotSupportedException($"{GetType().Name} is a one-way converter");
    }
}

public class StringIsNullToBoolConverter : BaseOneWayValueConverter
{
    public override object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        return value is not string text || !string.IsNullOrWhiteSpace(text);
    }
}

然后在您的标签中使用它,如下所示:

<ContentPage
.
.
.
.
xmlns:converters=*converter-namepsace-here* 
>
<ContentPage.Resources>
   <StringIsNullToBoolConverter x:Key="StringIsNullToBoolConverter"/>
</ContentPage.Resources>

然后在各自的标签中使用它:

<Label Text="{Binding Name}" IsVisible="{Binding Name,Converter={StaticResource StringIsNullToBoolConverter}}"/>
© www.soinside.com 2019 - 2024. All rights reserved.