基于绑定的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.
不确定你的触发问题,但我认为你应该能够完成颜色的改变首先实现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();
}
}