我有一个Xamarin.Forms应用程序,其页面都使用ControlTemplate来实现自定义标头。在标题中,一些页面(以及ControlTemplates)具有时间标签,该标签在ViewModel中使用计时器进行更新(带有绑定)。
我目前正在做的是在每个ViewModel上实现时间功能。有没有一种很好的方法可以在一个地方实现它,并在最少的样板代码中使用它?我想在App.xaml.cs中实现计时器,但我仍然需要以某种方式通知每个viewmodel。我只是想出一个优雅的解决方案。
答案 0 :(得分:0)
因为没有代码,所以很难说一个合适的解决方案是什么,但你可以使用基本的ViewModel并继承它吗?
或者,就像你自己说的那样,在你的App.xaml.cs中有一个,你可以通过Messaging Center来更新它,或者实现你自己的每个时间间隔触发的事件并从你的ViewModels。
答案 1 :(得分:0)
这是我的解决方案。它使用.NET标准库而不是PCL。您需要.NET Standard for System.Threading.Timer,否则您需要使用Xamarin.Forms Timer或第三方实现。
public partial class App : Application
{
private Timer timer;
private AutoResetEvent autoEvent = new AutoResetEvent(false); // Configures the state of the event
public App()
{
this.InitializeComponent();
// Start timer
this.timer = new Timer(this.CheckTime, this.autoEvent, 1000, 60000);
}
// ViewModels will subscribe to this
public static event EventHandler<TimeEventArgs> TimeEvent;
// The TimerCallback needed for the timer. The parameter is not practically needed but needed for the TimerCallback signature.
private void CheckTime(object state) =>
this.OnRaiseTimeEvent(new TimeEventArgs(DateTime.Now.ToString("HH:mm")));
// Invokes the event
private void OnRaiseTimeEvent(TimeEventArgs e) =>
TimeEvent?.Invoke(this, e);
}
在ViewModel中
public class ViewModel : BaseViewModel
{
private string time;
public ViewModel()
{
// Subscribes to the event
App.TimeEvent += (object o, TimeEventArgs e) =>
{
this.Time = e.Time;
};
}
// Bind to this in your view
public string Time
{
get => this.time;
set => this.SetProperty(ref this.time, value);
}
}