2011-05-09 33 views
7

Estoy utilizando el WFP con diseño MVVM para mi primer proyecto y tengo el problema de actualizar la vista después de procesar un comando del cliente para actualizar la entidad. En este momento, la vista puede hablar con el modelo de vista, pero el modelo de vista no pudo responder. ¿Alguien tiene alguna idea de cómo hacer que esto funcione? Gracias, JdangCómo actualizar la vista desde un modelo de vista en WPF usando el diseño MVVM

+0

Lo siento mucho, pero ¿Ha resuelto este problema? Me quedé en el mismo .. – curiousity

Respuesta

3

Debe hacer que ViewModel implemente INotifyPropertyChanged y desencadenar el evento PropertyChanged cuando cambien las propiedades de ViewModel. Suponiendo que la interfaz de usuario está vinculada a las propiedades de ViewModel, esto debería funcionar.

2

En una aplicación MVVM típica, utiliza enlaces para conectar la vista al ViewModel. Los enlaces se actualizan automáticamente cuando ViewModel provoca el evento PropertyChanged, definido por la interfaz INotifyPropertyChanged. Por lo tanto, debe implementar esa interfaz en ViewModel y generar el evento PropertyChanged cuando se modifique el valor de una propiedad, y la vista reflejará el cambio automáticamente.

+0

Sí, implemento INotifyPropertyChanged y desencadenar el evento PropertyChanged pero nada cambia en la vista. ¿Tengo que hacer algo especial a la vista? Actualmente, aquí está lo que tengo – AustinTX

+0

Sí, implemento INotifyPropertyChanged y desencadenar el evento PropertyChanged pero nada cambia en la vista. ¿Tengo que hacer algo especial a la vista? Actualmente, aquí está lo que tengo para mi xaml Text = "{Vinculando usuario.Nombre de usuario, Modo = TwoWay, UpdateSourceTrigger = PropertyChanged} ". ¿Tiene algún ejemplo para que eche un vistazo? – AustinTX

+0

Debería funcionar con lo que tiene ... ¿Podría editar su pregunta para incluir más código? –

3

Si usted es nuevo en el patrón MVVM, recomiendo los siguientes como excelentes recursos de MSDN que cubren tanto el patrón y la forma de ponerla en práctica en las aplicaciones de WPF y Silverlight:

  1. Implementing the MVVM Pattern
  2. Advanced MVVM Scenarios

sobre la base de lo que ha dicho, parece que es posible que desee revisar data binding, y cómo se puede aprovechar la INotifyPropertyChanged, INotifyCollectionChanged, una d ICollectionView interfaces para permitir la comunicación bidireccional entre sus vistas y modelos de visualización.

El enlace de datos de Silverlight y WPF admite múltiples modos de enlace de datos. Con el enlace de datos unidireccional, los controles de UI pueden vincularse a un modelo de vista para que reflejen el valor de los datos subyacentes cuando se representa la visualización. El enlace de datos bidireccional también actualizará automáticamente los datos subyacentes cuando el usuario lo modifique en la interfaz de usuario. Para garantizar que la UI se mantenga actualizada cuando los datos cambian en el modelo de vista, debe implementar la interfaz de notificación de cambio adecuada.

+0

Sí, implemento INotifyPropertyChanged y activa el evento PropertyChanged pero no cambia nada en la vista. Tengo que hacer algo especial en la vista. Actualmente esto es lo que tengo Text = "{Binding User.UserName, Mode = TwoWay, UpdateSourceTrigger = PropertyChanged}" – AustinTX

+1

Su encuadernación parece ser correcto. ¿Ha verificado que PropertyChanged se está generando cuando la propiedad UserName se cambia configurando un punto de interrupción? Además, compruebe que el nombre textual de la propiedad que está generando para el evento coincide exactamente con el nombre de su propiedad. y vea el modelo si lo desea, eso ayudaría a solucionar el problema. – Oppositional

1

Además a las otras respuestas, me gustaría también sugieren tener sus ViewModels extienden DependencyObject.

Algunas personas creen que los DependencyObjects son pesados ​​(y pueden serlo, si creas miles de instancias de ellos) y un poco complejos para los usuarios nuevos (definitivamente hay situaciones en las que esto es cierto). Sin embargo, existen otras ventajas para DependencyObjects, como el soporte automático para la notificación de cambio de propiedad y la velocidad de evaluación de enlace.

Aquí es mi fragmento de DP (guardar como DependencyProperty.snippet en C: \ Users [Su nombre aquí] \ Documentos \ Visual [2010, 2008] \ fragmentos de código \ Visual C# \ Mis fragmentos de código Estudio):

<?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

Estoy de acuerdo en que obtiene algunos beneficios de rendimiento usando un DependencyObject, b pero están vinculados al hilo en el que se crearon y los objetos de dependencia no son serializables. En ciertos casos, definitivamente son el camino a seguir, pero en general es más seguro (y aún relativamente efectivo) utilizar un POCO con las interfaces de notificación. – Oppositional

+0

Para los interesados, http://msdn.microsoft.com/en-us/library/bb613546.aspx#HowDataBindingReferencesAreResolved proporciona información decente sobre las implicaciones de rendimiento de las que habla Will. – Oppositional

Cuestiones relacionadas