Xamarin.Forms - 当绑定属性为空时使用 DataTrigger 隐藏框架

问题描述

我有一个应用程序需要在其绑定属性为空时隐藏框架。有两个框架(在 CollectionView 中),每个框架可能接收也可能不接收任何数据。如果他们不这样做,我希望他们消失。我已经尝试了多种方法包括附加代码中的方法

这是这些框架的屏幕截图(圆形控件)。完全白色的那些不附加任何数据,所以它们是空的或空的(老实说不确定哪个。我相信它们是空的)。

enter image description here

以下是第一帧的代码

<Frame CornerRadius="50"
       HeightRequest="45"
       WidthRequest="45"
       Padding="0"
       BackgroundColor="{Binding Assessments[0].BackgroundColor}">
           <Frame.Triggers>
               <DataTrigger targettype="Frame"
                            Binding="{Binding Assessments[0].TypeLetter}"
                            Value="x:null">
                            <Setter Property="IsVisible" Value="false"/>
               </DataTrigger>
           </Frame.Triggers>
           <Label Text="{Binding Assessments[0].TypeLetter}"
                  FontSize="24"
                  TextColor="White"
                  FontAttributes="Bold"
                  VerticalTextAlignment="Center"
                  HorizontalTextAlignment="Center"/>
  </Frame>

这是第二帧的代码

<Frame CornerRadius="50"
       HeightRequest="45"
       WidthRequest="45"
       Padding="0"
       BackgroundColor="{Binding Assessments[1].BackgroundColor}">
    <Frame.Triggers>
        <DataTrigger targettype="Frame"
                     Binding="{Binding Assessments[1].TypeLetter,TargetNullValue=''}"
                     Value="">
            <Setter Property="IsVisible" Value="False"/>
        </DataTrigger>
    </Frame.Triggers>
    <Label Text="{Binding Assessments[1].TypeLetter}"
           x:Name="lable2"
           FontSize="24"
           TextColor="White"
           FontAttributes="Bold"
           VerticalTextAlignment="Center"
           HorizontalTextAlignment="Center"/>
</Frame>

这些都没有奏效。我知道我可以通过实现转换器来解决这个问题,但我很想知道是否有办法这样做,因为我更喜欢触发器。早在 2017 年,使用 x:null 方法似乎就存在一些错误,但我认为 4 年后它会得到修复。

无论如何,任何帮助/指针都会很棒。我不知道如何进行这项工作。

此外,这里是它们绑定到的对象的代码

public class Assessment
{
    public string Name { get; set; }
    public AssessmentType Type { get; set; }
    public bool IsComplete { get; set; }
    public string BackgroundColor
    {
        get { return IsComplete ? "#558f45" : "Gray"; }
        set { BackgroundColor = value; }
    }
    public DateTime Start { get; set; }
    public DateTime End { get; set; }
    public string Date => Start.ToString("MMM dd") + " - " + End.ToString("MMM dd");
    public string TypeLetter => Type.ToString().Substring(0,1).toupper();

    public Assessment(string name,AssessmentType type,bool isComplete,DateTime startTime,DateTime endTime)
    {
        Name = name;
        Type = type;
        IsComplete = isComplete;
        Start = startTime;
        End = endTime;
    }
}

解决方法

使用转换器

public class NullToVisibilityConverter : IValueConverter
{
    public object Convert(object value,Type targetType,object parameter,CultureInfo culture)
    {
        if (value == null)
           return false;
        //else if()
        //{ write your logic if any}
        else 
           return true;
    }

    public object ConvertBack(object value,CultureInfo culture)
    {
        return value;
    }
}

XML

xmlns:converters="clr-namespace:YourProject.NameSpace.xxx.Converters"
...
<ContentPage.Resources>
    <converters:NullToVisibilityConverter x:Key="NullToVisibilityConverter"/>
</ContentPage.Resources>
...
<Frame CornerRadius="50"
       HeightRequest="45"
       WidthRequest="45"
       Padding="0"
       IsVisible="{Binding Assessments[1].TypeLetter,Converter={StaticResource NullToVisibilityConverter}}"
       BackgroundColor="{Binding Assessments[1].BackgroundColor}">