Xamarin.Forms数据绑定中的数据触发器——数值未更新

3
我希望在视频中展示已经过去的时间。我有一个包含格式说明符的标签,就像这样:

<Label Text="{Binding CurrentTime, StringFormat='{0:D3} seconds'}" />

这个方法是可行的,我得到了一个类似于053秒的字符串。当视频没有播放时,我想要显示文本未播放,我可以像这样指定:

<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>

当视频未播放时,它会正确地显示未播放,但一旦开始播放,标签就永远停留在000秒。出了什么问题?

编辑

视图如下所示:

<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}" />

你绑定的类是否实现了INotifyPropertyChanged接口? - Jason
@Jason 当我没有触发器时,该值被正确设置并更新。 - Steztric
你的模型或视图模型是什么样子? - ethane
@Ethan2Pants 我添加了相关部分。 - Steztric
所以,您的模型是页面? - Yuri S
显示剩余3条评论
1个回答

4

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>

1
@Steztric,使用默认设置器很好。你是对的,在许多选项的情况下,它会更有效。 - Yuri S
@Steztric 这个怎么样?我编辑了我的回答。 - Yuri S
给标签(即使是空字符串)设置默认值实际上是一个好习惯。 - Yuri S
我试过了,它可以工作 :-) 这是不同的默认绑定还是直接设置。 - Yuri S
让我们在聊天中继续这个讨论。点击此处进入聊天室 - Steztric
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接