使用 BindingContext 在 StackLayout 中绑定标签的 TextColor

Binding TextColor of Label inside StackLayout with BindingContext

我需要绑定 TextColorLabel。但是 Label 位于 StackLayout 内,BindingContextSelectedArticle,因此绑定无法与 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 可以在运行时更改,这就是为什么我需要绑定

样式不适用于绑定中的值。

第一个选项: 您不需要样式:

<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/(数据触发器部分)

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

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

例如

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

然后,使用那个 x:Name 作为参考并得到它的 BindingContext

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