Bastante tarde, pero creo que esto es lo suficientemente complicado como para merecer muchas perspectivas diferentes.
entiendo que no quiero que mi máquina virtual para saber acerca de la vista conectada, pero es razonable para la vista para tener una referencia a su máquina virtual?
Como ya se ha respondido, una disposición correcta de View-ViewModel implica que ViewModel se asigne como la propiedad DataContext de View. Eso permite que los DataBindings se establezcan "automágicamente" a partir de XAML declarativo, o que se ajusten a través del código subyacente.
A veces, usted estará tentado a escribir, en su código detrás, algo como esto:
var dc = DataContext as CleverViewModel;
CleverViewModel.CleverProperty.Add(someValue); // just a simple example
Creo que la manera adecuada para lograr este tipo de cosas es que no se ponga DataContext, pero en su lugar:
tener cierto control dedicado en Ver, por ejemplo, un ItemsControl con su ItemsSource de dos vías de enlace de datos a alguna propiedad en modelo de vista:
<ItemsSource x:Name="cleverControl" Visibility="Collapsed" ItemsSource="{Binding CleverProperty, Mode=TwoWay}"/>
moldeada la propiedad con destino en lugar de todo el modelo de vista, en el código detrás:
var collection = (ObservableCollection<double>)cleverControl.ItemsSource; collection.Add(someValue);
Nota la diferencia importante: el segundo enfoque en este ejemplo no requiere la Ver para conocer el tipo de ViewModel, solo necesita una propiedad llamada CleverProperty
de tipo ObservableCollection<double>
. Esto me permite tener ViewModels polimórficos o incluso pato-tipados.
Si un control en una vista se abre otra vista (por ejemplo, un cuadro de diálogo) debería manejar esto en la vista? Parece incorrecto manejarlo en la máquina virtual desde , luego la máquina virtual tiene algún conocimiento de una vista específica.
Esto no debería ocurrir en MVVM estricto, y no es difícil evitar el uso de DataTemplates.DataTemplates mapa un determinado tipo de DataContext a un determinado tipo de vista, por lo que cada vez que el DataContext de ContentControl cambios, la pantalla también cambia, siempre y cuando tenga un DataTemplate para ese tipo:
Un control en la vista podría enviar un comando al ViewModel, que a su vez actualizaría algunas de sus propias propiedades, que se reflejarían en la vista.
Una vista podría contener otra vista, fuera del conocimiento de ViewModel. En este caso, el código subyacente puede manipular el contexto de datos de la vista contenida.
Hay más sutilezas, pero he estado utilizando este enfoque con buenos resultados. Espero que esto ayude a alguien.
Una vista hace referencia a una máquina virtual, pero no debería ser de otra manera. http://stackoverflow.com/a/3670669/1977871 – VivekDev