Sto utilizzando il WFP con MVVM design per il mio primo progetto e sto avendo il problema di aggiornare la vista dopo che ho elaborato un comando dal client per aggiornare l'entità. In questo momento, la vista può dialogare con il modello di visualizzazione, ma il modello di visualizzazione non può tornare a visualizzare. Qualcuno ha qualche idea su come farlo funzionare? Grazie, JdangCome aggiornare la vista da un viewmodel in WPF usando il design MVVM
risposta
Si dovrebbe rendere ViewModel implementare INotifyPropertyChanged e attivare l'evento PropertyChanged quando le proprietà ViewModel cambiano. Supponendo che l'interfaccia utente sia associata alle proprietà ViewModel, ciò dovrebbe funzionare.
In un'applicazione MVVM tipica, si utilizzano i collegamenti per connettere la vista a ViewModel. I collegamenti vengono aggiornati automaticamente quando ViewModel solleva l'evento PropertyChanged
, definito dall'interfaccia INotifyPropertyChanged
. Quindi è necessario implementare tale interfaccia nel ViewModel e aumentare l'evento PropertyChanged
quando il valore di una proprietà viene modificato e la vista rifletterà la modifica automaticamente.
Sì, implemento INotifyPropertyChanged e sparo l'evento PropertyChanged ma nulla cambia sulla vista. Devo fare qualcosa di speciale in vista. Attualmente ecco cosa ho – AustinTX
Sì, implemento INotifyPropertyChanged e sparo l'evento PropertyChanged ma nulla cambia sulla vista. Devo fare qualcosa di speciale in vista. Attualmente ecco cosa ho per il mio xaml Text = "{Binding User.UserName, Mode = TwoWay, UpdateSourceTrigger = PropertyChanged}. "Hai qualche esempio da darmi un'occhiata? – AustinTX
Dovrebbe funzionare con quello che hai ... Potresti modificare la tua domanda per includere più codice? –
Se siete nuovi al modello MVVM, vi consiglio i seguenti eccellenti risorse da MSDN che coprono sia il modello e come implementarlo in applicazioni WPF e Silverlight:
in base a ciò che hai detto, sembra che si potrebbe desiderare di rivedere data binding, e come si può sfruttare l'INotifyPropertyChanged, INotifyCollectionChanged, un d interfacce ICollectionView per abilitare la comunicazione bidirezionale tra viste e modelli di vista.
Il collegamento dati Silverlight e WPF supporta più modalità di associazione dati. Con l'associazione dati unidirezionale, i controlli dell'interfaccia utente possono essere associati a un modello di visualizzazione in modo che riflettano il valore dei dati sottostanti quando viene visualizzato il rendering. L'associazione bidirezionale dei dati aggiornerà automaticamente i dati sottostanti quando l'utente la modifica nell'interfaccia utente. Per garantire che l'interfaccia utente sia tenuta aggiornata quando i dati cambiano nel modello di visualizzazione, è necessario implementare l'interfaccia di notifica delle modifiche appropriata.
Sì, attuo INotifyPropertyChanged e attiva l'evento PropertyChanged ma non cambia nulla sulla vista. Devo fare qualcosa di speciale sulla vista. Attualmente ecco cosa ho Text = "{Binding User.UserName, Mode = TwoWay, UpdateSourceTrigger = PropertyChanged}" – AustinTX
Sembra che sia corretto Hai verificato che PropertyChanged viene generato quando la proprietà UserName viene modificata impostando un punto di interruzione? Inoltre, controlla che il nome testuale della proprietà che stai generando per l'evento corrisponda esattamente al nome della tua proprietà. e vedi il modello se vuoi, questo aiuterebbe a risolvere il tuo problema. – Oppositional
Oltre alle altre risposte, vorrei anche suggerire avere i ViewModel estendono DependencyObject.
Alcune persone credono che DependencyObjects sia pesante (e possono essere, se ne crei migliaia di istanze) e un po 'complesso per i nuovi utenti (sicuramente ci sono situazioni in cui ciò è vero). Esistono, tuttavia, altri vantaggi in DependencyObjects, come il supporto automatico per la notifica delle modifiche alla proprietà e la velocità della valutazione vincolante.
Ecco il mio frammento di DP (Salva con nome DependencyProperty.snippet in C: \ Users [IL NOME QUI] \ Documenti \ Visual Studio [2010, 2008] \ Frammenti di codice \ Visual C# \ My Code Snippets):
<?xml version="1.0" encoding="utf-8"?>
<CodeSnippets xmlns="http://schemas.microsoft.com/VisualStudio/2005/CodeSnippet">
<CodeSnippet Format="1.0.0">
<Header>
<SnippetTypes>
<SnippetType>Expansion</SnippetType>
</SnippetTypes>
<Title>SnippetFile1</Title>
<Author>will</Author>
<Description>
</Description>
<HelpUrl>
</HelpUrl>
<Shortcut>dp</Shortcut>
</Header>
<Snippet>
<Declarations>
<Literal Editable="true">
<ID>PropertyName</ID>
<ToolTip>Property name</ToolTip>
<Default>PropertyName</Default>
<Function>
</Function>
</Literal>
<Literal Editable="false">
<ID>ClassName</ID>
<ToolTip>Class name</ToolTip>
<Default>ClassName</Default>
<Function>ClassName()</Function>
</Literal>
<Literal Editable="true">
<ID>Type</ID>
<ToolTip>Property type</ToolTip>
<Default>object</Default>
<Function>
</Function>
</Literal>
<Literal Editable="true">
<ID>DefaultValue</ID>
<ToolTip>Default value</ToolTip>
<Default>null</Default>
<Function>
</Function>
</Literal>
</Declarations>
<Code Language="csharp"><![CDATA[#region $PropertyName$
/// <summary>
/// The <see cref="DependencyProperty"/> for <see cref="$PropertyName$"/>.
/// </summary>
public static readonly DependencyProperty $PropertyName$Property =
DependencyProperty.Register(
$PropertyName$Name,
typeof($Type$),
typeof($ClassName$),
new UIPropertyMetadata($DefaultValue$));
/// <summary>
/// The name of the <see cref="$PropertyName$"/> <see cref="DependencyProperty"/>.
/// </summary>
public const string $PropertyName$Name = "$PropertyName$";
/// <summary>
/// $end$
/// </summary>
public $Type$ $PropertyName$
{
get { return ($Type$)GetValue($PropertyName$Property); }
set { SetValue($PropertyName$Property, value); }
}
#endregion ]]></Code>
</Snippet>
</CodeSnippet>
</CodeSnippets>
Concordo sul fatto che tu ottenga dei benefici in termini di prestazioni usando un oggetto DependencyObject, b ut sono legati al thread su cui sono stati creati e gli oggetti dipendenza non sono serializzabili. In certi casi sono decisamente la strada da percorrere, ma in generale è più sicuro (e ancora relativamente performante) utilizzare un POCO con le interfacce di notifica. – Oppositional
Per chi fosse interessato, http://msdn.microsoft.com/en-us/library/bb613546.aspx#HowDataBindingReferencesAreResolved fornisce informazioni decenti sulle implicazioni di cui parla Will. – Oppositional
- 1. WPF (MVVM): chiusura di una vista da Viewmodel?
- 2. Prism2/MVVM Chiudi vista da ViewModel
- 3. Passare KeyEventArgs su ViewModel da View in WPF (MVVM)
- 4. Come aggiornare l'interfaccia utente in MVVM WPF
- 5. Come inizializzare Vista nidificata (e ViewModel) senza utilizzare il risolutore di dipendenze in WPF/MVVM
- 6. Test di unità MVVM WPF per ViewModel?
- 7. Come modificare la visibilità di un controllo WPF da ViewModel
- 8. UI di aggiornamento dalla classe ViewModel (pattern MVVM) in WPF
- 9. Il MVVM ViewModel dovrebbe eseguire la conversione/convalida del tipo?
- 10. Come impostare Focus su un controllo WPF usando MVVM?
- 11. Apri/Chiudi vista da ViewModel
- 12. Come aggiornare ObservableCollection dall'interno di un BackgroundWorker usando MVVM?
- 13. Database WPF Image.Source in MVVM
- 14. Passaggio dei valori tra Viewmodel in MVVM in WPF
- 15. Il modo migliore per creare un ViewModel in MVVM
- 16. MVVM WPF: associare un ViewModel diverso a ciascun TabItem?
- 17. Esegui il comando dopo aver caricato la vista WPF MVVM
- 18. MVVM, WPF e convalida
- 19. Come chiudere la finestra di dialogo da viewmodel (Caliburn + WPF)?
- 20. WPF MVVM Dubbi
- 21. come implementare int osservabile in wpf ViewModel?
- 22. Comando in MVVM (WPF) - come restituire un valore?
- 23. WPF, MVVM, ICommand e repository
- 24. Aggiornamento dell'interfaccia utente asincrona da ViewModel in WPF
- 25. MVVM Pattern, ViewModel DataContext domanda
- 26. Come modificare la scheda da TabControl in WPF senza violare il pattern MVVM
- 27. Associazione eventi WPF da View a ViewModel?
- 28. Come aggiornare manualmente la vista AngularJS usando la sintassi ControllerAs?
- 29. Wpf UserControl e MVVM
- 30. Best practice WPF: i controlli personalizzati funzionano correttamente con il design MVVM?
Molto dispiaciuto, ma hai risolto questo problema? Mi sono bloccato nello stesso .. – curiousity