寻找将某些代码放在WPF MVVM应用程序中的指导

时间:2013-06-19 17:37:14

标签: c# wpf mvvm

第一次尝试MVVM,寻找明确放置代码的位置。

我的主视图需要绑定到一个包含1到多个UserControls的列表。

列表是否存在于ViewModel或Model中?从我正在阅读的内容来看,模型通常包含View通过ViewModel绑定的属性。我没有看到它如何工作,模型不需要知道UserControls列表是一个View(UserControl)的列表,我可能会比需要更难,但我仍然包装我的想法应放在代码的位置,我想了解它。感谢您提供任何指导,或者如果我没有自我解释,请告诉我。

2 个答案:

答案 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。