在WPF MVVM中动态添加控件

时间:2012-06-19 05:57:28

标签: wpf mvvm-light

我正在开发一个动态搜索视图,其中单击一个按钮应该添加一个包含3个组合框和2个文本框的新行。

我该怎么做呢?

3 个答案:

答案 0 :(得分:54)

如果你真的想做mvvm,试着忘记“我该如何添加控件”。你没必要,只考虑你的viewmodels - WPF为你创建控件:)

在你的情况下,我们假设我们有一个SearchViewModel和一个SearchEntryViewmodel。

public class SearchEntryViewmodel
{
    //Properties for Binding to Combobox and Textbox goes here
}


public class SearchViewModel 
{
    public ObservableCollection<SearchEntryViewmodel> MySearchItems {get;set;}
    public ICommand AddSearchItem {get;}
}

直到现在你不必考虑用户控制/视图。在SearchView {}创建ItemsControl并将ItemsSource绑定到MySearchItems

<ItemsControl ItemsSource="{Binding MySearchItems}"/> 

您现在可以看到SearchEntryViewmodels中的所有ItemsControl(just the ToString() atm)

为了满足您的要求,使用3Comboboxes等显示每个SearchEntryViewmodel,您只需在资源中定义DataTemplate

<DataTemplate DataType="{x:Type local:SearchEntryViewmodel}">
    <StackPanel Orientation="Horizontal">
        <Combobox ItemsSource="{Binding MyPropertyInSearchEntryViewmodel}"/>
        <!-- the other controls with bindings -->
    </StackPanel>
</DataTemplate>

这就是全部:)你永远不必考虑“如何动态添加控件?”。您只需在集合中添加新的SearchEntryViewmodel即可。

这种方法被称为 Viewmodel First ,我认为这是做MVVM最简单的方法。

答案 1 :(得分:0)

如果您不熟悉MVVM和WPF,那么有一个非常精彩的视频教程如何 由Jason Dollinger构建一个C#/ WPF / MVVM应用程序,可在on lab49获得。他在这个惊人的视频中开发的所有源代码也可以right here on lab49.

观看之后,您肯定无法在开发搜索视图时遇到任何问题。

答案 2 :(得分:0)

一个选项是您可以通过创建新的instanse在后端创建TextBoxes和组合框。 但更好的选择是您可以创建一个usercontrol,其中包含您要添加的所有texbox和组合框以及您想要的格式。 按下按钮后创建后,您可以创建此用户控件的实例,并使用控件的 SetValue 属性将其设置在网格或任何其他控件中。

如果您是WPF和MVVM的新手,请阅读此博客以了解这一点。

https://radhikakhacharia.wordpress.com/2012/06/01/wpf-tutorial-3/

https://radhikakhacharia.wordpress.com/2012/02/13/model-view-viewmodel/