在我看来,我有这个:
<TextBlock Text="{Binding Title}"/>
绑定到我的ViewModel的Title属性,这很简单,效果很好:
private string _title;
public string Title
{
get
{
return _title;
}
set
{
_title = value;
OnPropertyChanged("Title");
}
}
但是我的ViewModel还有一个属性“FormFields”,它是一个包含许多其他UserControls的StackPanel:
private StackPanel _formFields;
public StackPanel FormFields
{
get
{
return _formFields;
}
set
{
_formFields = value;
OnPropertyChanged("FormFields");
}
}
如何从我的视图中绑定它?
在ASP.NET中有一个 PlaceHolder 元素,我正在寻找具有相同功能的东西,例如
PSEUDO CODE:
<PlaceHolder Content="{Binding FormFields}"/>
答案 0 :(得分:18)
首先,不要。您应该指示数据(模型),而不是从VM中指定UI。换句话说,属性类型应为ObservableCollection<FormField>
。然后您的视图将绑定如下:
<ItemsControl ItemsSource="{Binding FormFields}">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<StackPanel/>
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
</ItemsControl>
这通常在父元素的.Resources
部分中定义。 I.e Window.Resources
或WrapPanel.Resources
。
话虽如此,您可以使用ContentPresenter
抓取StackPanel
并将其粘贴在可视树中:
<ContentPresenter Content="{Binding FormFields}"/>
答案 1 :(得分:0)
您是否尝试使用Border
或仅使用普通Grid
?
<Border Content="{Binding FormFields}" />
不过,我正在质疑设计。表单字段应位于视图中,并且应在数据模板中指定视图,该模板基于视图模型类型进行实例化。我不会亲自做你在代码中做的事情。
干杯。