如何在另一个模型中拥有模型列表

本文关键字:模型 列表 拥有 另一个 | 更新日期: 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>