基于绑定的XAML改变框架背景

本文关键字:XAML 改变 框架 背景 于绑定 绑定 | 更新日期: 2023-09-27 18:06:01

我有一个ObservableCollection是基于以下类:

public class Data
{
    public string Text { get; set; }
    public DateTime Date { get; set; }
    public bool IsActive { get; set; }
}

这个observablecollection被用作ListView的ItemSource。下面是显示数据的DataTemplate -

<DataTemplate>
    <ViewCell>
        <Frame OutlineColor="White" HasShadow="False">
             <!-- Data -->
        </Frame>
    </ViewCell>
</DataTemplate>

因为ObservableCollection是一个Data类的集合,它有一个布尔属性,我想用来改变帧的背景颜色:

  • 如果属性IsActive是true - BackgroundColor是红色

  • 如果IsActive属性为false - BackgroundColor为Blue

我已经研究了触发器的实现,但是我似乎不能让它们正常工作,我不确定我错过了什么。

根据Xamarin文档,我应该能够做到:

<Frame>
    <Frame.Trigger>
        <!-- -->
    </Frame.Trigger>  
</Frame>

然而这似乎是不可能的。这也不是-

<Frame>
<Frame.Style>
    <Style TargetType="Frame">
        <Setter Property="BackgroundColor" Value="Blue" />
        <Style.Triggers>
            <DataTrigger Binding="{Binding IsActive}" Value="True">
                <Setter Property="BackgroundColor" Value="Red"/>
            </DataTrigger>
        </Style.Triggers>
    </Style>
</Frame.Style>
</Frame>

上面的代码给出了以下错误消息:

Xamarin.Forms.Xaml.XamlParseException: Position 28:26. The Property TargetType is required to create a Xamarin.Forms.DataTrigger object.

基于绑定的XAML改变框架背景

不确定你的触发问题,但我认为你应该能够完成颜色的改变首先实现INotifyPropertyChanged在你的数据类,像这样:

public class Data : INotifyPropertyChanged
{
    public string Text { get; set; }
    public DateTime Date { get; set; }
    private bool _isActive;
    public bool IsActive 
    {
        get { return _isActive; }
        set
        {
            if (value == _isActive)
            {
                return;
            }
            _isActive = value;
            NotifyPropertyChanged("IsActive");
        }
    }
    public event PropertyChangedEventHandler PropertyChanged;
    public void NotifyPropertyChanged(string propertyName)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }
    }
}

然后,在你的xaml中,你应该能够做这样的事情:

<DataTemplate>
    <ViewCell>
        <Frame Background="{Binding IsActive, Converter={StaticResource IsActiveToColorConverter}}" OutlineColor="White" HasShadow="False">
             <!-- Data -->
        </Frame>
    </ViewCell>
</DataTemplate>

其中IsActiveToColorConverter看起来像:

public class IsActiveToColorConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        var isActive = (bool) value;
        return isActive ? "Red" : "Blue";
    }
    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}