Puede usar cualquier modelo con el que se sienta cómodo, sí, todas sus propiedades necesitarán el comportamiento INotifyPropertyChanged. Cómo afectará esto a la capa de servicio depende totalmente de su implementación.
Supongo que usted indica que se une a su DTO en su punto de vista?
Como veo es que hay una falta de coincidencia de impedancia entre las capas de la aplicación, es decir, su modelo de dominio probablemente se parece a su modelo relacional, con diferencias sutiles pero cruciales. También existe una discrepancia entre el Modelo de Dominio y su DTO (los objetos pueden ser aplanados, propiedades calculadas, etc., ...). Es tentador vincularse directamente con los DTO, ya que probablemente estén diseñados para tener lo que necesita para la operación en particular, sin embargo, también existe una falta de coincidencia de impedancia entre el DTO y lo que necesita la vista para lograr el resultado deseado. Aquí es donde entra en juego el modelo de vista. El modelo de vista tiene la responsabilidad de transmitir las propiedades de DTO a la vista, es responsable de informar a la vista si hay errores de validación y enruta los comandos al controlador apropiado (Guardar, Eliminar, etc. , ...).
que tienden a establecer las cosas de la manera siguiente:
// POCO object. Serializable.
public class AddressDto
{
public int Id { get; set; }
public string Street { get; set; }
public string City { get; set; }
public string Country { get; set; }
}
// IDataErrorInfo for validation.
public class AddressViewModel : INotifyPropertyChanged, IDataErrorInfo
{
private readonly AddressDto addressDto;
public AddressViewModel(AddressDto addressDto)
{
this.addressDto = addressDto;
}
public int Id { /* get and set for property changed event and update dto */ }
public string Street { /* get and set for property changed event and update dto */ }
public string City { /* get and set for property changed event and update dto */ }
public string Country { /* get and set for property changed event and update dto */ }
...
// IDataErrorInfo implementation
}
public class EditAddressViewModel : INotifyPropertyChanged
{
public AddressViewModel Address { /* get and set for property changed event */ }
public ICommand Save { /* setup command */ }
public ICommand Cancel { /* setup command */ }
private void Save()
{
}
private void Cancel()
{
}
}
Su EditAddressView entonces unirse al EditAddressViewModel. Básicamente, la regla es que todo su comportamiento de UI debe expresarse en términos de su modelo de vista.
Sí, eso significa trabajo adicional, aunque hay cosas que puede hacer para simplificar un poco las cosas (generación de código, etc.). De hecho, estoy trabajando en una biblioteca que pretende simplificar todo el proceso MVVM utilizando una API apta.Compruébelo en http://fluentviewmodel.codeplex.com/
Gracias, parece que no hay un consenso realmente definido en este momento. Dado que ya has hecho algo similar sin problemas, aceptaré este como respuesta. – JonC