Desidero scrivere un ViewModel che conosca sempre lo stato corrente di alcune proprietà di dipendenza di sola lettura dalla vista.Riattivazione delle proprietà della GUI di sola lettura in ViewModel
In particolare, la GUI contiene un FlowDocumentPageViewer, che visualizza una pagina alla volta da un FlowDocument. FlowDocumentPageViewer espone due proprietà di dipendenza di sola lettura denominate CanGoToPreviousPage e CanGoToNextPage. Voglio che il mio ViewModel conosca sempre i valori di queste due proprietà View.
ho pensato che avrei potuto fare questo con un'associazione dati OneWayToSource:
<FlowDocumentPageViewer
CanGoToNextPage="{Binding NextPageAvailable, Mode=OneWayToSource}" ...>
Se questo è stato permesso, sarebbe perfetto: ogni volta di proprietà CanGoToNextPage del FlowDocumentPageViewer cambiato, il nuovo valore sarebbe ottenere spinto verso il basso nella NextPageAvailable del ViewModel proprietà, che è esattamente quello che voglio.
Sfortunatamente, questo non viene compilato: viene visualizzato un messaggio di errore che indica la proprietà "CanGoToPreviousPage" è di sola lettura e non può essere impostato dal markup. Le proprietà apparentemente in sola lettura non supportano alcun tipo di databinding, nemmeno il databinding che è di sola lettura rispetto a quella proprietà.
Potrei rendere le proprietà del mio ViewModel DependencyProperties e fare un binding OneWay andando nell'altro senso, ma non mi fa impazzire la violazione della separazione delle preoccupazioni (ViewModel avrebbe bisogno di un riferimento alla vista, che MVVM databinding dovrebbe evitare).
FlowDocumentPageViewer non espone un evento CanGoToNextPageChanged e non conosco alcun metodo valido per ottenere notifiche di modifica da DependencyProperty, a meno di creare un'altra DependencyProperty per associarlo a, che sembra eccessivo.
Come posso mantenere il mio ViewModel informato delle modifiche alle proprietà di sola lettura della vista?
mi chiedo se potessi fare qualche trucco per collegare automaticamente le proprietà, senza bisogno di osservare. Ma questa sembra una soluzione eccellente. Grazie! –
Grazie Kent. Ho pubblicato un esempio di codice qui sotto per questa classe "SizeObserver". –
+1 a questo sentimento: "I DP di sola lettura dovrebbero supportare i collegamenti OneWayToSource" – Tristan