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这个怎么样?编辑我的回答实际上,为标签提供默认值(即使是空字符串)是一种很好的做法