2009-06-08 20 views
5

En mi opinión tengo esto:¿Cómo puedo vincular un StackPanel a mi ViewModel?

<TextBlock Text="{Binding Title}"/> 

que se une a mi título de propiedad del modelo de vista y esto es sencillo y funciona bien:

private string _title; 
public string Title 
{ 
    get 
    { 
     return _title; 
    } 

    set 
    { 
     _title = value; 
     OnPropertyChanged("Title"); 
    } 
} 

Sin embargo, mi modelo de vista también tiene la propiedad "FormFields " que es un StackPanel que contiene un número de otros UserControls:

private StackPanel _formFields; 
public StackPanel FormFields 
{ 
    get 
    { 
     return _formFields; 
    } 

    set 
    { 
     _formFields = value; 
     OnPropertyChanged("FormFields"); 
    } 
} 

¿Cómo puedo enlazar esto desde mi punto de vista?

En ASP.NET había un elemento PlaceHolder, estoy buscando algo con la misma funcionalidad, p.

PSEUDO CÓDIGO:

<PlaceHolder Content="{Binding FormFields}"/> 

Respuesta

18

En primer lugar, no lo hacen. En lugar de dictar la IU de su VM, debe dictar datos (el modelo). En otras palabras, el tipo de propiedad debe ser ObservableCollection<FormField>. Luego, su vista se uniría de la siguiente manera:

<ItemsControl ItemsSource="{Binding FormFields}"> 
    <ItemsControl.ItemsPanel> 
     <ItemsPanelTemplate> 
      <StackPanel/> 
     <ItemsPanelTemplate> 
    </ItemsControl.ItemsPanel> 
</ItemsControl> 

Dicho esto, se puede utilizar un ContentPresenter para agarrar el StackPanel y pegarlo en el árbol visual:

<ContentPresenter Content="{Binding FormFields}"/> 
+0

Hmmm, vale, no pude hacer que funcione con ItemsSource y, por tanto, descubrí que puede hacer que una propiedad de ViewModel sea un elemento XAML que parecía ser un patrón muy útil, tendrá que replantearse esto, pero el ContentPresenter funciona bien por ahora, gracias. –

+0

No hay propiedad ItemsSource para StackPanel. –

+0

@Greg Sansom: reparado. –

0

¿Ha intentado utilizar un Border o solo un simple Grid?

<Border Content="{Binding FormFields}" /> 

Todavía estoy cuestionando el diseño. Los campos de formulario deben residir en una vista y la vista debe especificarse en una plantilla de datos que se crea una instancia en función del tipo de modelo de vista. Personalmente no haría lo que estás haciendo en el código.

Saludos.

Cuestiones relacionadas