2011-05-09 15 views
7

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

+0

Molto dispiaciuto, ma hai risolto questo problema? Mi sono bloccato nello stesso .. – curiousity

risposta

3

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.

2

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.

+0

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

+0

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

+0

Dovrebbe funzionare con quello che hai ... Potresti modificare la tua domanda per includere più codice? –

3

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:

  1. Implementing the MVVM Pattern
  2. Advanced MVVM Scenarios

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.

+0

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

+1

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

1

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> 
+0

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

+0

Per chi fosse interessato, http://msdn.microsoft.com/en-us/library/bb613546.aspx#HowDataBindingReferencesAreResolved fornisce informazioni decenti sulle implicazioni di cui parla Will. – Oppositional

Problemi correlati