在使用 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为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>
Run Code Online (Sandbox Code Playgroud)
我已被告知,这不是做事情的每个实体,是的,而且MVVM方式,ModelB而ModelC应该有自己的ViewModel。我被告知要保留这些Model课程,但ViewModel要为它们创建s。我无法想象这是如何工作的。
如果我创建一个ModelBViewModel:
public class ModelBViewModel
{
ModelB MyModelB { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
我有一个困境 - 我已经ModelB在ModelA类中有实例,我现在ModelB在ModelBViewModel. 是否有必要遍历其中的原始ModelB集合ModelA并创建ModelBViewModels,MyModelB在ModelA我进行时将属性设置为与其中匹配?看起来有点复杂的东西应该是相当简单的?
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)
| 归档时间: |
|
| 查看次数: |
1035 次 |
| 最近记录: |