具有复杂模型的 MVVM

mon*_*ter 5 c# wpf mvvm

在使用 MVVM 模式时,当Model对象变得复杂时,即当它们包含非原始/非内置属性时,我会遇到一些麻烦。在我的特定实例中,我有一个ModelA包含ModelB对象集合的对象,这些对象本身包含一个ModelC对象集合:

class ModelA
{
    public string Name { get; set; }
    public OberservableCollection<ModelB> Bs { get; set; }
}

class ModelB
{
    public string Make { get; set; }
    public ObservableCollection<ModelC> Cs { get; set; }
}

class ModelC
{
    public string Brand{ get; set; }
}
Run Code Online (Sandbox Code Playgroud)

我有一个ModelAViewModel允许访问收集的ModelB Bs财产。在这种情况下,我没有创建ViewModelfor ModelB。我使用s为ModelBModelC集合(和单个实例)设置了样式DataTemplate

<DataTemplate x:Key="modelATemplate">
    <Grid Margin="5">
        <Grid.RowDefinitions>
            <RowDefinition />
        </Grid.RowDefinitions>
        <ScrollViewer Grid.Row="2" VerticalScrollBarVisibility="Auto">
            <ItemsControl  ItemsSource="{Binding Bs}" ItemTemplate="{StaticResource modelBTemplate}"/>
        </ScrollViewer>
    </Grid>
</DataTemplate>

<DataTemplate x:Key="modelBTemplate">
    <Grid Margin="5" HorizontalAlignment="Center">
        <Grid.RowDefinitions>
            <RowDefinition />
            <RowDefinition />
        </Grid.RowDefinitions>
        <TextBlock Grid.Row="0" Text="{Binding Make}">
        <ItemsControl Grid.Row="1" ItemsSource="{Binding Mode=OneWay, Path=Cs}"
                  ItemTemplate="{StaticResource ResourceKey=modelCTemplate}">
        </ItemsControl>
    </Grid>
</DataTemplate>
Run Code Online (Sandbox Code Playgroud)

我已被告知,这不是做事情的每个实体,是的,而且MVVM方式,ModelBModelC应该有自己的ViewModel。我被告知要保留这些Model课程,但ViewModel要为它们创建s。我无法想象这是如何工作的。

如果我创建一个ModelBViewModel

public class ModelBViewModel
{
     ModelB MyModelB { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

我有一个困境 - 我已经ModelBModelA类中有实例,我现在ModelBModelBViewModel. 是否有必要遍历其中的原始ModelB集合ModelA并创建ModelBViewModels,MyModelBModelA我进行时将属性设置为与其中匹配?看起来有点复杂的东西应该是相当简单的?

mak*_*kzr 1

MVVM 的意思是“模型视图视图模型”。如您所见,名称包含 Model 和 ViewModel。这个想法是为您拥有的每个 Model 类都有一个专用的 ViewModel 类。

ViewModel 应包含特定于视图的属性和逻辑,而 Model 类应包含特定于业务模型的属性和逻辑。

并且:是的,对于一些非常简单的 MVVM 示例,这可能会产生开销。然而,一旦您的视图逻辑开始与业务逻辑分离,您就会从这种分离中受益。

如果有必要迭代原始属性:我会说:是的!我通常这样做:

public class ModelBViewModel
{
    private ModelB _model;

    public ObservableCollection<ModelCViewModel> CVms { get; set; }

    public ModelBViewModel(ModelB model) {
        _model = model;
        CVms = new ObservableCollection();
        foreach(var modelC in model.Cs) {
            CVms.Add(new ModelCViewModel(modelC));
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 我一直认为应该为每个视图创建一个 ViewModel,而不是为每个模型创建一个 ViewModel。否则除了MVC还有什么用呢 (3认同)