第一次尝试MVVM,寻找明确放置代码的位置。
我的主视图需要绑定到一个包含1到多个UserControls的列表。
列表是否存在于ViewModel或Model中?从我正在阅读的内容来看,模型通常包含View通过ViewModel绑定的属性。我没有看到它如何工作,模型不需要知道UserControls列表是一个View(UserControl)的列表,我可能会比需要更难,但我仍然包装我的想法应放在代码的位置,我想了解它。感谢您提供任何指导,或者如果我没有自我解释,请告诉我。
答案 0 :(得分:7)
您的UserControls
应该有一个ViewModel(现在让我们称之为ItemViewModel
。)
您的MainViewModel应该有ObservableCollection<ItemViewModel>
。
然后,您的视图应该有一个ItemsControl
(或其衍生产品,例如ListBox
),ItemsSource
属性将绑定到ObservableCollection
。
然后,ItemsControl
应定义包含ItemTemplate
。{/ p>的UserControl
这是使用WPF / MVVM进行描述的正确方法。
示例(伪代码):
MainViewModel:
public class MainViewModel
{
public ObservableCollection<ItemViewModel> Items {get;set;}
}
的MainView:
<Window>
<ItemsControl ItemsSource="{Binding Items}">
<ItemsControl.ItemTemplate>
<DataTemplate>
<my:UserControl/>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</Window>
请注意,UserControl
的每个实例都会将DataContext
设置为源集合中的相应项。
因此,如果您的ItemsViewModel看起来像这样:
public class ItemsViewModel
{
public string LastName {get;set;}
public string FirstName {get;set;}
//INotifyPropertyChanged, etc.
}
您的UserControl
可以这样定义:
<UserControl>
<StackPanel>
<TextBox Text="{Binding LastName}"/>
<TextBox Text="{Binding FirstName}"/>
</StackPanel>
</UserControl>
答案 1 :(得分:2)
您不应该需要UserControl列表。您可能拥有的是View绑定到ViewModel中的项目列表。例如,创建一个ListBox并将其ItemsSource设置为ViewModel的列表。
要为每个项创建一个用户控件,您需要为列表中的类型创建一个DataTemplate并指定UserControl,并且可以将该usercontrol中的任何绑定赋予该项。
然后,ListBox将使用DataTemplate为列表中的每个项目创建一个UserControl。