Sincronizzazione di oggetti dal codice con la vista in WPF

1

Ne ho letto un po ', ma ho un po' di tempo, quindi ora richiederei una soluzione semplice e prometto di leggerlo in seguito. Vengo da uno sfondo di winforms c # e ultimamente ho lavorato con WPF. Dato che l'interfaccia utente che sto implementando non è un input intensivo, ho utilizzato fino ad ora INotifyPropertyChanged. Fino a quando mi sono imbattuto in questo:

Ho un'interfaccia 3D da una libreria di terze parti (MogreInWpf). Facendo clic su un oggetto nell'interfaccia 3D, ho bisogno di visualizzare alcune proprietà dell'oggetto (posizione, dimensione, ecc.). Ecco come appare il mio code-behind. Ho una classe, chiamiamola objectOfInterest, che salva tutte queste proprietà, i dati 3D e include alcuni metodi che manipolano l'oggetto. In uno di questi metodi, viene generata una griglia contenente caselle di testo per simulare coppie di proprietà nome-valore. Come "Posizione X:" "134". Poiché queste proprietà sono solo modificate dall'utente, sono riuscito a collegare la casella di testo sull'evento modificato di testo per rispondere alla maggior parte delle modifiche, ad esempio quando la dimensione viene modificata da 134 a 1345.

Una volta generata questa griglia, questa viene impostata per essere visualizzata nella finestra principale utilizzando un ContentPresenter e impostandone il contenuto su objectOfInterest.grid. Funziona come un fascino. Ora, devo implementare una proprietà che cambia il modo in cui appare la griglia delle proprietà a seconda di una casella combinata inclusa in questa griglia.

Ad esempio, se l'oggetto è un cubo, voglio mostrare larghezza / altezza / lunghezza, mentre voglio solo una proprietà raggio per mostrare se è una sfera. In questo caso sono bloccato, poiché la rigenerazione della griglia sulla casella combinata selectedValueChanged non notifica la vista e la generazione si verifica nella classe objectOfInterest anziché nella classe della finestra principale, il che significa che non riesco a rebind la griglia una volta rigenerata (I impossibile chiamare contentPresenter.Content = objectOfInterest.grid di nuovo, poiché la finestra principale non ha idea che la griglia delle istanze sia cambiata). Quindi, senza comprendere completamente i metodi MVVM e riscrivere la maggior parte dell'applicazione per adattarla al modello, come può essere realizzato?

    
posta JasonX 14.12.2013 - 14:03
fonte

1 risposta

1

Se ho capito bene, in pratica hai un ContentPresenter e vuoi che i contenuti cambino a seconda del tipo di oggetto presentato.

Sembra che tu abbia creato una classe ObjectOfInterest che contiene l'oggetto di interesse, ad esempio un cubo o una sfera, e genera una griglia in base al tipo di oggetto che contiene. Se ti capisco bene, allora ...

Lascerò ObjectOfInterest e collegherò il Cubo o Sphere direttamente alla proprietà Content di ContentPresenter dalla selezione della casella combinata. Nelle risorse ContentPresenter (Es. < ContentPresenter.Resources >), definire un DataTemplate per ogni tipo di oggetto. Non definire una chiave per ogni modello, solo impostare la proprietà DataType sui tipi di oggetto che verranno visualizzati. Nel DataTemplate, basta definire la Griglia che si desidera visualizzare, completa con i controlli del database. Quando imposti la proprietà Content di ContentPresenter, cercherà automaticamente le sue risorse e applicherà il modello appropriato per ciascun oggetto.

Se hai bisogno di ObjectOfInterest e questo deve essere impostato come contenuto, assicurati che ci sia una proprietà a cui puoi accedere che identifica il tipo di oggetto. Creare DataTemplates per i diversi tipi di oggetto e definire un DataTemplateSelector che contiene quei modelli e verificherà la proprietà del tipo di oggetto e restituirà il DataTemplate appropriato. Quindi associare DataTemplateSelector a ContentPresenter. ContentTemplateSelector proprietà.

    
risposta data 14.12.2013 - 20:45
fonte

Leggi altre domande sui tag