问题描述
我有一个应用程序需要在其绑定属性为空时隐藏框架。有两个框架(在 CollectionView 中),每个框架可能接收也可能不接收任何数据。如果他们不这样做,我希望他们消失。我已经尝试了多种方法,包括附加代码中的方法。
这是这些框架的屏幕截图(圆形控件)。完全白色的那些不附加任何数据,所以它们是空的或空的(老实说不确定哪个。我相信它们是空的)。
以下是第一帧的代码。
<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}">