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

use*_*898 3 c# wpf mvvm

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

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

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

Fed*_*gui 7

UserControls应该有一个ViewModel(我们ItemViewModel现在就调用它).

你的MainViewModel应该有一个ObservableCollection<ItemViewModel>.

那么你的视图应该有一个ItemsControl(或其衍生物之一ListBox),ItemsSource属性将绑定到该视图ObservableCollection.然后ItemsControl应该定义一个ItemTemplate包含你的UserControl.

这是使用WPF/MVVM进行描述的正确方法.

示例(伪代码):

MainViewModel:

public class MainViewModel
{
    public ObservableCollection<ItemViewModel> Items {get;set;}
}
Run Code Online (Sandbox Code Playgroud)

的MainView:

<Window>
   <ItemsControl ItemsSource="{Binding Items}">
       <ItemsControl.ItemTemplate>
          <DataTemplate>
             <my:UserControl/>
          </DataTemplate>
       </ItemsControl.ItemTemplate>
   </ItemsControl>
</Window>
Run Code Online (Sandbox Code Playgroud)

请记住,每个实例都UserControl将其DataContext设置为源集合中的相应项.

因此,如果您的ItemsViewModel看起来像这样:

public class ItemsViewModel
{
    public string LastName {get;set;} 
    public string FirstName {get;set;} 
    //INotifyPropertyChanged, etc.
}
Run Code Online (Sandbox Code Playgroud)

你的UserControl定义如下:

<UserControl>
   <StackPanel>
      <TextBox Text="{Binding LastName}"/>
      <TextBox Text="{Binding FirstName}"/>
   </StackPanel>
</UserControl>
Run Code Online (Sandbox Code Playgroud)