我创建了以下模型(简化了代码以说明情况):
public abstract class Account
{
public string Name { get; set; }
}
public class Person : Account
{
public string FirstName { get; set; }
public string LastName { get; set; }
}
public class Company : Account
{
public string Owner { get; set; }
}
接下来我创建了一个视图模型:
public class ViewModel
{
public Account Model { ... }
public string Name { ... }
public string FirstName { ... }
public string LastName { ... }
public string Owner { ... }
...
}
最后,观点:
<UserControl>
<UserControl.Resources>
<!-- Person data template -->
<DataTemplate x:Key="personTemplate" DataType="{x:Type model:Person}">
<Grid DataContext="{Binding ElementName=rootLayout, Path=DataContext}">
<TextBlock Text="{Binding Path=Name}" />
<TextBlock Text="{Binding Path=FirstName}" />
<TextBlock Text="{Binding Path=LastName}" />
</Grid>
</DataTemplate>
<!-- Company data template -->
<DataTemplate x:Key="companyTemplate" DataType="{x:Type model:Company}">
<Grid DataContext="{Binding ElementName=rootLayout, Path=DataContext}">
<TextBlock Text="{Binding Path=Name}" />
<TextBlock Text="{Binding Path=Owner}" />
</Grid>
</DataTemplate>
<!-- Data template selector for different account types -->
<local:AccountTemplateSelector x:Key="templateSelector"
PersonTemplate="{StaticResource personTemplate}"
CompanyTemplate="{StaticResource companyTemplate}" />
</UserControl.Resources>
<StackPanel Name="rootLayout" DataContext="{Binding Path=viewModel}">
<ContentControl Content="{Binding Path=Model}"
ContentTemplateSelector="{StaticResource templateSelector}"/>
<Button Content="Save" />
<Button Content="Close" />
</StackPanel>
</UserControl>
因此,当加载的模型类型为Person
the personTemplate
显示;反之亦然,当模型为Company
the companyTemplate
显示。
我的问题是:
- 这种方法有意义吗?删除它会更明智吗?
Model
财产在ViewModel
类并引入一个枚举或只是一个简单的bool
这会告诉人们如果true
,或公司,如果“假”?
- 在定义数据模板时,我指定了
DataType
s to Person
and Company
类型(对我来说这样做是很自然的)。我是否需要它,因为在最
下一行我将设置一个新的数据上下文作为来自UserControl
?
- 应该
DataType
数据模板可以是不同的视图模型,比如PersonViewModel
and CompanyViewModel
?创建它们有意义吗?
- 我怎样才能,我到底能不能让数据模板继承数据上下文
ContentControl
自动地?
我知道这一切最终都是个人选择的问题,但由于我正在学习 MVVM(我正在使用 MVVM Light),我想知道哪种方法是最值得推荐的?我仍然不完全理解何时应将模型中的类用作数据模板的数据类型以及何时应将视图模型用于此目的。表示模型的程序集是否应该在视图程序集中引用(假设视图、模型和视图模型都驻留在单独的程序集中)?
感谢您的所有澄清!
UPDATE:
此更新应该解释模型类的问题DataType
当模态类的属性不直接绑定到视图中的一个控件时,数据模板中会出现 s 。
有一个枚举和一个新属性Person
,所以现在看起来像这样:
public class Person : Account
{
public enum GenderType { Female, Male, NotSpecified }
public string FirstName { get; set; }
public string LastName { get; set; }
public GenderType Gender {get; set; }
}
在视图中,人员的数据模板当然也发生了变化:
<!-- Person data template -->
<DataTemplate x:Key="personTemplate" DataType="{x:Type model:Person}">
<Grid DataContext="{Binding ElementName=rootLayout, Path=DataContext}">
<TextBlock Text="{Binding Path=Name}" />
<TextBlock Text="{Binding Path=FirstName}" />
<TextBlock Text="{Binding Path=LastName}" />
<RadioButton Name="Female" />
<RadioButton Name="Male" />
<RadioButton Name="NotSpecified" />
</Grid>
</DataTemplate>
If the Content
of the ContentControl
被设定为Model
的财产ViewModel
,我将如何解决性别/单选按钮的情况;因为,现在它们以一个控件/一个属性的方式不匹配?