gpt4 book ai didi

c# - 具有复杂模型的 MVVM

转载 作者:太空宇宙 更新时间:2023-11-03 12:34:48 25 4
gpt4 key购买 nike

当使用 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 属性的集合。在本例中,我没有为 ModelB 创建一个 ViewModel。我通过使用 DataTemplates 设置了 ModelBModelC 集合(以及单个实例)的样式:

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

我有一个困境 - 我已经在 ModelA 类中有 ModelB 实例,我现在在 中有其他 ModelB 实例>模型B View 模型。是否需要遍历 ModelA 中的原始 ModelB 集合并创建 ModelBViewModel,设置 MyModelB 属性在我走的时候匹配 ModelA 中的那个?本应简单的事情却显得有点复杂?

最佳答案

MVVM 的意思是“模型 View View 模型”。如您所见,名称中包含 Model 和 ViewModel。这个想法是为您拥有的每个模型类提供一个专用的 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com