In my view I have this:
<TextBlock Text="{Binding Title}"/>
which binds to my ViewModel's Title property and this is straightforward and works well:
private string _title;
public string Title
{
get
{
return _title;
}
set
{
_title = value;
OnPropertyChanged("Title");
}
}
However my ViewModel also has the Property "FormFields" which is a StackPanel that contains a number of other UserControls:
private StackPanel _formFields;
public StackPanel FormFields
{
get
{
return _formFields;
}
set
{
_formFields = value;
OnPropertyChanged("FormFields");
}
}
How do I bind this from my view?
In ASP.NET there was a PlaceHolder element, I'm looking for something with the same functionality, e.g.
PSEUDO CODE:
<PlaceHolder Content="{Binding FormFields}"/>
Have you tried using a
Border
or just a plainGrid
?Still, I'm questioning the design. The Form Fields should live in a view, and the view should be specified in data template which is instantiated based on the view model type. I wouldn't personally do what you're doing in code.
Cheers.
Firstly, don't. Instead of dictating the UI from your VM, you should be dictating data (the model). In other words, the property type should be
ObservableCollection<FormField>
. Then your view would bind as follows:This is generally defined in the
.Resources
section of a parent element. I.eWindow.Resources
orWrapPanel.Resources
.Having said that, you can use a
ContentPresenter
to grab theStackPanel
and stick it in the visual tree: