Ciao.
Ho un dubbio sul da farsi; il problema in se e per se l'avrei anche risolto, ma non so se sia l'approccio corretto.
Sto sviluppando un'App per UniversalApp, con Caliburn Micro 2.
Ho una lista di oggetti che potrebbero cambiare il loro stato di minuto in minuto, passando da uno stato "disponibile" ad uno "scaduto", in base al fatto che l'orario impostato sia o meno stato superato, una cosa del tipo:
public class MioOggettoConScadenza{
[...]
public Disable {
{
get{
return this.MyTime.TimeOfDay > DataTime.Now.TimeOfDay;
}
}
}
Nel ViewModel ho una lista simile a questa:
var miaLista = new ObservableCollection<MioOggettoConScadenza>();
Vorrei usare il DispatcherTimer per forzare l'aggiornamento del Binding, visto che di minuto in minuto lo stato Disable può cambiare.
La soluzione che ho trovato è ciclare sugli elementi XAML collegati alla lista e fare come da msdn:
private void dispatcherTimer_Tick(object sender, EventArgs e) {
foreach (var mioElem in XamlElements){ //XamlElements rappresent gli elementi in binding creati in una ListView a runtime e ognuno collegato con DataContext impostato ad un'istanza di MioOggettoConScadenza
BindingExpression be = mioElem.GetBindingExpression(mioElem.MiaProperty);
be.UpdateTarget();
}
}
Probabilmente questa soluzione funziona, ma non mi convince... dato che la proprietà implementa INotifyPropertyChanged vorrei scatenare l'update dal ViewModel e non dalla view; ho pensato di creare un metodo pubblico negli oggetti MioOggettoConScadenza tipo questo:
public async Task ForseUpdateDisable(){
NotifyOfPropertyChanged(() => Disable );
}
e quindi nel BM fare
private void dispatcherTimer_Tick(object sender, EventArgs e) {
foreach (var elem in miaLista){
elem.ForseUpdateDisable(); // Non credo serva await, anzi
}
}
Entrambe le soluzioni non mi fanno impazzire, ma forse mi sto complicando la vita...
Le domande:
1) Qual'è l'approccio migliore fra i 2 ? In caso entrambe le soluzioni facciano schifo, alternativa?
2) E' la prima volta che utilizzo la classe DispatcherTimer: è lo strumento corretto da utilizzare oppure no? Rischio dei blocchi della UI?