Xaml Xamarin.Forms与数据触发器绑定-值未更新

Xaml Xamarin.Forms与数据触发器绑定-值未更新,xaml,xamarin,data-binding,xamarin.forms,datatrigger,Xaml,Xamarin,Data Binding,Xamarin.forms,Datatrigger,我想在视频上显示经过的时间。我有一个带有如下格式说明符的标签: <Label Text="{Binding CurrentTime, StringFormat='{0:D3} seconds'}" /> <Label Text="{Binding CurrentTime, StringFormat='{0:D3} seconds'}"> <Label.Triggers> <DataTrigger TargetType="Labe

我想在视频上显示经过的时间。我有一个带有如下格式说明符的标签:

<Label Text="{Binding CurrentTime, StringFormat='{0:D3} seconds'}" />
<Label Text="{Binding CurrentTime, StringFormat='{0:D3} seconds'}">
    <Label.Triggers>
        <DataTrigger TargetType="Label" Binding="{Binding IsPlaying}" Value="False">
            <Setter Property="Text" Value="Not playing" />
        </DataTrigger>
    </Label.Triggers>
</Label>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             x:Class="MyNamespace.VideoPage"
             x:Name="ThePage"
             BindingContext="{x:Reference Name=ThePage}">
    <StackLayout>
        <Label VerticalOptions="Center" Text="{Binding CurrentTime, StringFormat='{0:D3} seconds'}" HorizontalOptions="StartAndExpand">
            <Label.Triggers>
                <DataTrigger TargetType="Label" Binding="{Binding IsPlaying}" Value="False">
                    <Setter Property="Text" Value="Not playing" />
                </DataTrigger>
            </Label.Triggers>
        </Label>
        <!-- More stuff -->
    </StackLayout>
</ContentPage>
public partial class VideoPage : ContentPage
{
    private int currentTime;

    public int CurrentTime
    {
        get { return currentTime; }
        set
        {
            currentTime = value;
            OnPropertyChanged();
        }
    }

    private bool isPlaying;

    public bool IsPlaying
    {
        get { return isPlaying; }
        set
        {
            isPlaying = value;
            OnPropertyChanged();
        }
    }

    ...
}
当视频未播放时,这将正确显示
未播放
,但当视频播放时,标签将永远粘贴在
000秒
上。出什么事了

编辑 视图如下所示:

<Label Text="{Binding CurrentTime, StringFormat='{0:D3} seconds'}" />
<Label Text="{Binding CurrentTime, StringFormat='{0:D3} seconds'}">
    <Label.Triggers>
        <DataTrigger TargetType="Label" Binding="{Binding IsPlaying}" Value="False">
            <Setter Property="Text" Value="Not playing" />
        </DataTrigger>
    </Label.Triggers>
</Label>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             x:Class="MyNamespace.VideoPage"
             x:Name="ThePage"
             BindingContext="{x:Reference Name=ThePage}">
    <StackLayout>
        <Label VerticalOptions="Center" Text="{Binding CurrentTime, StringFormat='{0:D3} seconds'}" HorizontalOptions="StartAndExpand">
            <Label.Triggers>
                <DataTrigger TargetType="Label" Binding="{Binding IsPlaying}" Value="False">
                    <Setter Property="Text" Value="Not playing" />
                </DataTrigger>
            </Label.Triggers>
        </Label>
        <!-- More stuff -->
    </StackLayout>
</ContentPage>
public partial class VideoPage : ContentPage
{
    private int currentTime;

    public int CurrentTime
    {
        get { return currentTime; }
        set
        {
            currentTime = value;
            OnPropertyChanged();
        }
    }

    private bool isPlaying;

    public bool IsPlaying
    {
        get { return isPlaying; }
        set
        {
            isPlaying = value;
            OnPropertyChanged();
        }
    }

    ...
}
编辑2 在Yuri的回答的帮助下,我用以下方法修复了它

<ContentPage.Resources>
    <ResourceDictionary>
        <Style TargetType="Label" x:Key="PlayingStyle">
            <Setter Property="Text" Value="Not playing" />
            <Style.Triggers>
                <DataTrigger TargetType="Label" Binding="{Binding IsPlaying}" Value="True">
                    <Setter Property="Text" Value="{Binding CurrentTime, StringFormat='{0:D3} seconds'}" />
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </ResourceDictionary>
</ContentPage.Resources>
...
<Label Style="{StaticResource PlayingStyle}" />

...

Xaml似乎被两种不同类型的文本绑定搞混了——一种来自触发器,另一种是“直接”绑定。这就是它的工作原理:

   <Label VerticalOptions="Center" HorizontalOptions="StartAndExpand">
        <Label.Triggers>
            <DataTrigger TargetType="Label" Binding="{Binding  IsPlaying}"  Value="True">
                <Setter Property="Text" Value="{Binding CurrentTime, StringFormat='{0:D3} seconds'}" />
            </DataTrigger>
            <DataTrigger TargetType="Label" Binding="{Binding  IsPlaying}"  Value="False">
                <Setter Property="Text" Value="Not playing" />
            </DataTrigger>
        </Label.Triggers>
    </Label>

考虑为标签提供一个“默认”值的选项,并将其作为没有样式的子项来执行

    <Label VerticalOptions="Center" HorizontalOptions="StartAndExpand" Text="Not playing">
        <Label.Triggers>
            <DataTrigger TargetType="Label" Binding="{Binding  IsPlaying}"  Value="True">
                <Setter Property="Text" Value="{Binding CurrentTime, StringFormat='{0:D3} seconds'}" />
            </DataTrigger>
        </Label.Triggers>
    </Label>


您要绑定以实现INotifyPropertyChanged的类是否已更改?@Jason当我没有触发器时,该值已正确设置并更新。您的模型或视图模型是什么样子?@Ethan2Parts我添加了相关部分而不是所有部分。我不知道如何绑定“页面”和调用OnPropertyChanged,但是定义了INotifyPropertyChanged的接口在哪里?你说对了一半。在这种情况下,您的建议很好,因为布尔值只有两个可能的值。如果它是一个数字,我想要一个值0的触发器和一个“其他所有内容”的设置,那么您的解决方案将不起作用。我的错误,您正确地指出了,是在试图用触发器覆盖属性时直接定义属性,这是行不通的。我已经用最终的解决方案更新了我的答案。我发现在Xamarin中真正让我恼火的是,我不能将这种特殊的风格直接定义为标签的子版本。出于某种原因,它不喜欢有触发器。它在WPF上的Xaml中工作。我想这只是其中的一个怪癖。@Steztric使用默认设置器很好。你是对的,在很多情况下,它会工作得更好options@Steztric这个怎么样?编辑我的回答实际上,为标签提供默认值(即使是空字符串)是一种很好的做法