我正在开发一个动态搜索视图,其中单击一个按钮应该添加一个包含3个组合框和2个文本框的新行。
我该怎么做呢?
答案 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/