如何将StackPanel绑定到ViewModel?

时间:2009-06-08 10:05:43

标签: wpf data-binding mvvm

在我看来,我有这个:

<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}"/>

2 个答案:

答案 0 :(得分:18)

首先,不要。您应该指示数据(模型),而不是从VM中指定UI。换句话说,属性类型应为ObservableCollection<FormField>。然后您的视图将绑定如下:

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

这通常在父元素的.Resources部分中定义。 I.e Window.ResourcesWrapPanel.Resources

话虽如此,您可以使用ContentPresenter抓取StackPanel并将其粘贴在可视树中:

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

答案 1 :(得分:0)

您是否尝试使用Border或仅使用普通Grid

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

不过,我正在质疑设计。表单字段应位于视图中,并且应在数据模板中指定视图,该模板基于视图模型类型进行实例化。我不会亲自做你在代码中做的事情。

干杯。