当使用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
设置了ModelC
和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>
有人告诉我,这不是MVVM的处理方式,每个实体,即
ModelB
和ModelC
应该具有自己的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/