Pregunta

Pregunta MVVM.Mensajería entre ViewModel y View, ¿cómo se implementa mejor?

La aplicación cuenta con algunos puntos de “comunicación con el usuario” como:“Ha ingresado comentarios para esta selección.¿Desea guardar o descartar” cuando cambia el valor de una selección Sí/No/NA.Entonces necesito alguna forma proscrita de vincular la Vista a los "mensajes" de ViewModel.

Seguí el camino comenzando con Messenger de la Fundación MVVM.Sin embargo, eso es más una transmisión de todo el sistema que un modelo de evento/suscriptor.Entonces, si la aplicación tiene dos instancias de una Vista (Persona1 EditView y Persona2 EditView) abiertas, ambas reciben el mensaje cuando un ViewModel publica el mensaje "¿Quieres guardar?".

¿Qué enfoque has utilizado?

Gracias Andy

¿Fue útil?

Solución

Para todo esto, utilizaría el enlace como método de "comunicación".Por ejemplo, el mensaje de confirmación podría mostrarse u ocultarse según las propiedades establecidas en su ViewModel.

Aquí está la vista

<Window.Resources>
     <BoolToVisibilityConverter x:key="boolToVis" />
</Window.Resources>
<Grid>

<TextBox Text="{Binding Comment, Mode=TwoWay}" />
<TextBlock Visibility="{Binding IsCommentConfirmationShown, 
                        Converter={StaticResource boolToVis}" 
           Text="Are you sure you want to cancel?" />

<Button Command="CancelCommand" Text="{Binding CancelButtonText}" />
</Grid>

Y aquí está tu ViewModel

// for some base ViewModel you've created that implements INotifyPropertyChanged
public MyViewModel : ViewModel 
{
     //All props trigger property changed notification
     //I've ommited the code for doing so for brevity
     public string Comment { ... }
     public string CancelButtonText { ... }
     public bool IsCommentConfirmationShown { ... }
     public RelayCommand CancelCommand { ... }


     public MyViewModel()
     {
          CancelButtonText = "Cancel";
          IsCommentConfirmationShown = false;
          CancelCommand = new RelayCommand(Cancel);
     }

     public void Cancel()
     {
          if(Comment != null && !IsCommentConfirmationShown)
          {
               IsCommentConfirmationShown = true;
               CancelButtonText = "Yes";
          }
          else
          {
               //perform cancel
          }
     }
}

Esta no es una muestra completa (¡la única opción es sí!:) ), pero con suerte esto ilustra que su Vista y su Modelo de Vista son casi una entidad y no dos que se hacen llamadas telefónicas entre sí.

Espero que esto ayude.

Otros consejos

Lo que Anderson describe es probablemente suficiente para que el requisito particular que usted describe. Sin embargo, es posible que desee ver en la Expression Blend Comportamientos que proporcionan un fuerte apoyo para las interacciones entre modelos de vista y opiniones, que pueden ser útiles en escenarios más complejos - con ayuda de la unión de 'mensajes' sólo va a llegar tan el momento.

Tenga en cuenta, el SDK mezcla expresión es de libre disposición - que no tiene que utilizar Expression Blend para utilizar el SDK o el comportamiento; aunque el IDE Blend tiene un mejor soporte incorporado para 'arrastrar y soltar' de comportamientos.

Además, tenga cada uno 'comportamiento' es un componente - en otras palabras es un modelo extensible; hay algunos comportamientos integrados en el SDK, pero usted puede escribir sus propios comportamientos.

Estos son algunos enlaces. (Nota, no deje que el 'Silverlight' inducir a error en el URL que - comportamientos son compatibles para WPF y Silverlight):

información

Blend SDK

video en comportamientos

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top