【问题标题】:Xamarin.Forms - Hiding a Frame with a DataTrigger when a bound property is nullXamarin.Forms - 当绑定属性为空时,使用 DataTrigger 隐藏框架
【发布时间】:2021-04-23 09:03:47
【问题描述】:

我有一个应用需要在其绑定属性为空时隐藏框架。有两个框架(在 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;
    }
}

【问题讨论】:

  • 你不能像Assessments[1].TypeLetter那样使用Xaml绑定
  • @FreakyAli 这些绑定实际上正在工作。这就是我为框架上的标签获取 O 和 P 的方式。
  • 是吗?他们过去没有那样工作,所以我认为他们仍然没有。感谢您的回复
  • 而不是 Type.ToString(),尝试使用 Convert.ToString(Type) 可能你会得到你需要的。

标签: c# xamarin xamarin.forms binding datatrigger


【解决方案1】:

使用转换器

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, Type targetType, object parameter, CultureInfo culture)
    {
        return value;
    }
}

Xaml

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}">

【讨论】:

  • 使用触发器不能做到这一点吗?转换器可以正常工作,但如果有办法使用 DataTrigger 做到这一点,那将是首选。
猜你喜欢
  • 2019-06-07
  • 1970-01-01
  • 2016-10-06
  • 2012-04-11
  • 2013-06-25
  • 2013-06-18
  • 2012-04-12
  • 2017-09-14
  • 2011-01-15
相关资源
最近更新 更多