我使用display a timer using progressBar xamarin forms引用的代码实现了时间进度响铃。
现在我想动态绑定总时间的值,以便当时间达到某个固定值时,进度环开始进行。我怎么能做到这一点?
答案 0 :(得分:0)
由于ConverterParameter
不是可绑定属性,因此我们无法使用Binding
。但我们可以尝试使用可绑定属性自定义此标签,并将自身传递给ConverterParameter
。
自定义此标签,如:
public class MyLabel : Label
{
public double TotalTime
{
set { SetValue(TotalTimeProperty, value); }
get { return (double)GetValue(TotalTimeProperty); }
}
public static readonly BindableProperty TotalTimeProperty = BindableProperty.Create(nameof(TotalTime), typeof(double), typeof(MyLabel), default(double));
}
然后我们可以在XAML中传递自己:
<local:MyLabel x:Name="MyLabel"
TotalTime="{Binding TotalTime}"
Text="{Binding Source={x:Reference progressBar}, Path=Progress, Converter={StaticResource countDownTime}, ConverterParameter={x:Reference MyLabel}"
HorizontalOptions ="Center"
FontSize="20"
FontFamily = "Helvetica Neue"
TextColor = "Red" />
最后在后面的代码中修改此TotalTime
:
public class BindModel : INotifyPropertyChanged
{
double totalTime;
public double TotalTime
{
set
{
totalTime = value;
onPropertyChanged("TotalTime");
}
get
{
return totalTime;
}
}
public event PropertyChangedEventHandler PropertyChanged;
void onPropertyChanged(string propertyName)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
}
// And set this model as a BindingContext
var model = new BindModel { TotalTime = 60000 };
BindingContext = model;
您的IValueConverter也应如下所示:
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
double time = 0;
double myTotalTime = ((MyLabel)parameter).TotalTime;
double.TryParse(myTotalTime.ToString(), out var totalTime);
double.TryParse(value.ToString(), out var progress);
time = progress <= double.Epsilon ? totalTime : (totalTime - (totalTime * progress));
var timeSpan = TimeSpan.FromMilliseconds(time);
return $"{timeSpan.Minutes:00;00}:{timeSpan.Seconds:00;00}";
}