【问题标题】:How do I bind a StackPanel to my ViewModel?如何将 StackPanel 绑定到我的 ViewModel?
【发布时间】:2009-06-08 10:05:43
【问题描述】:

在我看来,我有这个:

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

绑定到我的 ViewModel 的 Title 属性并且这很简单并且效果很好

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

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

但是我的 ViewModel 也有属性“FormFields”,它是一个包含许多其他用户控件的 StackPanel:

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

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

如何从我的视图中绑定它?

在 ASP.NET 中有一个 PlaceHolder 元素,我正在寻找具有相同功能的东西,例如

伪代码:

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

【问题讨论】:

    标签: wpf data-binding mvvm


    【解决方案1】:

    首先,不要。与其从 VM 口述 UI,不如口述数据(模型)。换句话说,属性类型应该是ObservableCollection&lt;FormField&gt;。然后您的视图将按如下方式绑定:

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

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

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

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

    【讨论】:

    • 嗯,好的,我无法让它与 ItemsSource 一起使用,因此发现您可以将 ViewModel 属性设置为 XAML 元素,这似乎是一种非常有用的模式,必须重新考虑一下,但是 ContentPresenter 目前运行良好,谢谢。
    • StackPanel 没有 ItemsSource 属性。
    • msdn.microsoft.com/en-us/library/… ItemsControl.ItemsPanel 的类型是ItemsPanelTemplate,所以您不需要将&lt;StackPanel/&gt; 包装成&lt;ItemsPanelTemplate&gt;&lt;StackPanel/&gt;&lt;/ItemsPanelTemplate&gt; 吗?
    • 这可能是七岁,但您的 ContentPresenter 评论让我很开心,谢谢!
    【解决方案2】:

    您是否尝试过使用Border 或只是简单的Grid

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

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

    干杯。

    【讨论】:

      猜你喜欢
      • 2011-03-13
      • 1970-01-01
      • 2011-11-03
      • 2020-03-06
      • 2011-03-22
      • 2013-08-13
      • 2014-08-06
      • 2011-11-30
      • 1970-01-01
      相关资源
      最近更新 更多