2012-06-15 23 views
5

Tengo una ventana WPF que muestra diferentes vistas autodefinidas. Hasta ahora pude usar todo lo que aprendí sobre MVVM :)Enlazar varias vistas a varios viewmodels

Ahora llegué a un nuevo "problema": tengo 10 entidades de la misma vista en una vista más grande. Estas diez entidades de vista contienen un conjunto de controles (cuadro de texto, cuadro combinado, etc.) pero son consistentes.

Entonces, ¿cómo puedo enlazar estas vistas a un modelo de vista?

Pensé en tener 10 instancias de ViewModel en el modelo de vista de "nivel superior" y dar a las vistas las instancias corregidas de la VM como datacontext.

Mi pregunta es ahora -> ¿Hay alguna manera más fácil (o más conveniente) de vincular muchas vistas (idénticas) a sus modelos de vista?

Código-Ejemplo:

Ver Modelo:

private PanelViewModel _panelViewModel1 = new PanelViewModel(); 
public PanelViewModel PanelVM1 
{ 
    get { return _panelViewModel1; } 
} 

Vista-Ejemplo:

<myControls:vwPanel HorizontalAlignment="Left" x:Name="vwPanel1" 
        VerticalAlignment="Top" DataContext="{Binding Path=PanelVM1}"/> 

Lo que me molesta es que necesitaría esta lógica diez veces durante diez vistas ?

ACTUALIZACIÓN: para responder a algunas preguntas: Quiero mostrar un punto de vista 10 veces (en mi ejemplo) he definido mi propio punto de vista heredando de control de usuario. Entonces mi vwPanel hereda de UserControl. Los 10 paneles vw simplemente se colocan dentro de un StackPanel dentro de una Grilla.

No se trata de mostrar datos, como señaló, habría una vista de lista o una cuadrícula de datos un mejor lugar para comenzar. Es un caso especial en el que necesito esta cantidad de controles de entrada:/

ACTUALIZACIÓN2: Lo que esperaba era más como definir una Lista de modelos de visualización y unir mis 10 vistas a una de esta lista. Pero esto no funcionará, ¿verdad? Al menos no sabría cómo referir una entidad "especial" en la lista de XAML ...

+1

¿Están las diez vistas en la vista más grande especialmente definidas? En otras palabras, ¿hay alguna razón por la que no pueda, por ejemplo, crear una lista y vincular esa lista a un IEnumerable de sus ViewModels y que se muestren de esa manera? – Tim

+0

@Tim Los necesito en el orden correcto para tener entrada y salida en el orden correcto. ¿Sería posible sin tenerlos especialmente definidos? – basti

Respuesta

8

Normalmente uso implícita DataTemplates para mapear Views a ViewModels.Pueden ir en <Application.Resources>, <Window.Resources> o incluso en menos elementos específicos solamente como <TabControl.Resources>

<DataTemplate DataType="{x:Type local:PanelViewModel}"> 
    <myControls:vwPanel /> 
</DataTemplate> 

Esto significa que en cualquier momento WPF se encuentra con un objeto en la VisualTree de tipo PanelViewModel, elabora usando vwPanel

objetos suelen quedar colocado en el VisualTree a través de un ItemsSource propiedad

<ItemsControl ItemsSource="{Binding CollectionOfAllPanels}" /> 

o utilizando a ContentControl

<ContentControl Content="{Binding PanelVM1}" /> 
+0

Pero, ¿qué puedo seguir "identificando"? Quiero decir en MVVM tienes el orden V-> VM-> M. ¿Mis puntos de vista conocerían su máquina virtual correcta utilizando su solución? ¿Especialmente si las propiedades de la máquina virtual cambian con la máquina virtual de mayor nivel? – basti

+0

@chiffre, el orden en que las máquinas virtuales aparecen en sus elementos Control es el orden exacto en que se agregan a la colección ItemsSource. Entonces, usando el ejemplo de Rachel, si agrega 3 modos de vista a "Paneles", se mostrarán en el orden en que los agregue. Cuando seleccionas el primero y cambias una propiedad en él, el modelo de vista en el índice 0 de Paneles cambiará esa propiedad. En cuanto a notificar la vista cuando su máquina virtual de nivel superior cambia otra máquina virtual, siempre que su máquina virtual implemente correctamente INotifyPropertyChanged, estará bien. – Thelonias

+0

@chiffre No estoy 100% seguro de entender su pregunta. Según entiendo, su máquina virtual contiene 10 propiedades 'PanelViewModel' que desea visualizar utilizando exactamente el mismo' Panel' UserControl. Dependiendo de cómo se enumeren sus paneles en la máquina virtual, puede mostrarlos utilizando algo así como 'ItemsControl' (si están almacenados en un' ObservableCollection'), o 'ContentControl' (si están almacenados en 10 propiedades separadas) . El 'DataContext' detrás del' PanelUserControl' será lo que '' PanelViewModel' esté vinculado, así que sí, ellos mostrarán los datos correctos cuando sean actualizados por el VM VM – Rachel

1

Si entiendo su pregunta correctamente, tiene una colección de algo que usted debe representar visualmente. Es decir, tiene varios modelos de vista para los que desea definir una única vista, pero muestra una X cantidad de veces. Su ejemplo muestra que usa un panel como su vista para "PanelViewModel" ... ¿cuál es el control del elemento principal para vwPanel? Suponiendo que está utilizando algo como un ListBox, puede definir un DataTemplate personalizado que contenga su vwPanel y asignar ese DataTemplate a su ListBox.ItemTemplate.

Por ejemplo:

<Window.Resources> 
    <DataTemplate x:Key="myVMTemplate" TargetType="{x:Type myViewModels:PanelViewModel}"> 
     <myControls:vwPanel HorizontalAlignment="Left" VerticalAlignment="Top"/> 
    </DataTemplate> 
</Window.Resources> 

<ListBox ItemsSource="{Binding Path=MyCollectionOfPanelVMs}" 
     ItemTemplate="{StaticResource myVMTemplate}" /> 

no han verificado que esto funciona.

Cuestiones relacionadas