用BindingContext在StackLayout中绑定Label的TextColor

本文关键字:Label TextColor 绑定 BindingContext StackLayout | 更新日期: 2023-09-27 18:09:11

我需要绑定LabelTextColor。但是LabelSelectedArticleBindingContextStackLayout内,因此绑定不能与SelectedArticle以外的任何东西一起工作(我在这里错了吗?)

public Color ArticleFontColor { get; set; }

<StackLayout BindingContext="{Binding SelectedArticle}">
    <Label Text="{Binding Title}" FontSize="Large"
           TextColor="{Binding ArticleFontColor}"
           FontAttributes="Bold"></Label>
</StackLayout>

考虑到这一点,我尝试使用Style,但值无法绑定。

<ContentPage.Resources>
    <ResourceDictionary>
        <Style x:Key="labelStyle" TargetType="Label">
          <Setter Property="TextColor" Value="{Binding ArticleFontColor}" />
        </Style>
    </ResourceDictionary>
</ContentPage.Resources>

<Label Text="{Binding Title}" FontSize="Large"
           Style="{StaticResource labelStyle}"
           FontAttributes="Bold"></Label>

TextColor可以改变运行时,这就是为什么我需要绑定

用BindingContext在StackLayout中绑定Label的TextColor

经过一番搜索,我找到了这个解决方案:

x:Name标签添加到您的ContentPage或根布局。

<ContentPage ... ... x:Name="MyRoot">

然后,使用x:Name作为参考,并获得其BindingContext

TextColor="{Binding BindingContext.ArticleFontColor, Source={Reference MyRoot}}"

样式不能处理来自绑定的值。

第一选择:你不需要样式:

<Label Text="{Binding Title}" FontSize="Large"
           TextColor="{Binding ArticleFontColor}"
           FontAttributes="Bold"></Label>

如果ArticleFontColor不是Color类型(例如:只有string),你应该使用IValueConverter实现来做转换(https://developer.xamarin.com/guides/cross-platform/xamarin-forms/user-interface/xaml-basics/data_binding_basics/-搜索IValueConverter)。

第二选择:

使用触发器来设置样式:http://developer.xamarin.com/guides/cross-platform/xamarin-forms/working-with/triggers/(Data Triggers部分)