如何在另一个模型中拥有模型列表
本文关键字:模型 列表 拥有 另一个 | 更新日期: 2023-09-27 18:01:33
我正在开发一个桌面应用程序并设计一个MVVM模式。我保留了一份有他们技能的人的名单。我的Person模型类似于:
public class Person
{
public string FirstName { get; set; }
public string LastName { get; set; }
// Other properties
}
和我有一个技能课
public class Skill
{
public string Name { get; set; }
public bool IsOn { get; set; }
}
你可能注意到每个技能都有一个名称和一个属性。如果这句话是真的,那就意味着这个人有这项技能。
现在我需要知道它是否在MVVM模式,我有一个列表属性在我的人模型?以及如何将此列表绑定到具有多重选择模式的列表框?以便每当用户单击ListBox中的一个项目时,selectedItem (Selected Skill)的IsOn属性被选中或取消选中?
提前感谢您的帮助。
MVVM与您的模型无关。您的模型可以(也将会)是任何东西:您自己的类、别人的类、数据库、专有主机,等等。所以在回答"如果它是好的在MVVM模式,我有一个列表属性在我的人模型?"答案是"任何对你的模型有意义"。:)
在MVVM中通常不允许的是将模型直接暴露给视图。视图通过视图模型(而不是模型)反映命令的状态、绑定命令和路由命令。理想情况下,视图对模型一无所知,只知道ViewModel。
那么让我们定义一个ViewModel类的中间集合,并开始按照这些来思考。
public class MainVM : ViewModelBase
{
public ObservableCollection<PersonVM> People { get; set; }
}
public class PersonVM : ViewModelBase
{
public string FirstName { get; set; }
public string LastName { get; set; }
public ObservableCollection<SkillVM> Skills { get; set; }
}
public class SkillVM : ViewModelBase
{
public string Name { get; set; }
public bool IsOn { get; set; }
}
你的视图将绑定到这些视图模型类上的属性,而不会绑定到你的模型本身的属性。您的"人员列表"视图将绑定到"people"集合。您的"技能列表"控件将绑定到"技能"集合。要确定是否选择了某个技能,或者选择该技能,您可以这样做(假设是WPF/silverlight风格的xhtml驱动视图):
<DataGrid ... ItemsSource="{Binding Skills}" ... />
<DataGrid.RowStyle>
<Style TargetType="DataGridRow">
<Setter Property="IsSelected" Value="{Binding IsOn, Mode=TwoWay}" />
</Style>
</DataGrid.RowStyle>