当使用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; }
}

我有一个ModelAViewModel,它允许访问ModelB Bs属性的集合。在这种情况下,我还没有为ViewModel创建一个ModelB。我已经使用ModelB设置了ModelCDataTemplate集合(以及单个实例)的样式:
<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>

有人告诉我,这不是MVVM的处理方式,每个实体,即ModelBModelC应该具有自己的ViewModel。有人告诉我保留Model类,但为它们创建ViewModel。我无法想象这将如何进行。

如果我创建一个ModelBViewModel:
public class ModelBViewModel
{
     ModelB MyModelB { get; set; }
}

我有一个困境-ModelB类中已经有ModelA实例,现在ModelB中已经有其他ModelBViewModel实例。是否有必要遍历ModelB中的原始ModelA集合并创建ModelBViewModel,并设置MyModelB属性以与ModelA中的属性相匹配?看起来应该比较简单的东西似乎有点复杂?

最佳答案

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

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

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

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

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));
        }
    }
}

关于c# - 具有复杂模型的MVVM,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41460105/

10-15 23:01