【问题标题】:How to have a list of models in another model?如何在另一个模型中拥有模型列表?
【发布时间】:2014-05-04 21:56:52
【问题描述】:

我正在开发一个桌面应用程序并设计一个 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; }
}

您可能会注意到,每个技能都有一个名称和一个 IsOn 属性。只要是真的,就意味着这个人有技能。

现在我需要知道在 MVVM 模式中是否可以在我的 Person 模型中有一个 List 属性? 以及如何将此列表绑定到具有多选模式的 ListBox?这样每当用户点击 ListBox 中的某个项目时,selectedItem(Selected Skill)的 IsOn 属性就会被选中或取消选中?

提前感谢您的帮助。

【问题讨论】:

    标签: c# list mvvm model


    【解决方案1】:

    MVVM 与您的模型无关。您的模型可以(并且将会)是任何东西:您自己的类、其他人的类、数据库、专有大型机等等。因此,回答“如果在 MVVM 模式中我的 Person 模型中有一个 List 属性可以吗?”答案是“任何对你的模型有意义的东西”。 :)

    在 MVVM 中通常不好的是将模型直接暴露给视图。视图反映了视图模型的状态、绑定和路由命令,而不是模型。理想情况下,视图对模型一无所知,只知道视图模型。

    所以让我们定义一组中间的 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; }
    }
    

    您的视图将绑定到这些视图模型类的属性,而不是模型本身的属性。您的“人员列表”视图将绑定到“人员”集合。您的“技能列表”控件将绑定到“技能”集合。要确定是否选择了一项技能,或者要选择该技能,您可能会执行类似的操作(假设 WPF/Silverlight 样式的 XAML 驱动视图):

    <DataGrid ... ItemsSource="{Binding Skills}" ... />
    <DataGrid.RowStyle>
         <Style TargetType="DataGridRow">
             <Setter Property="IsSelected" Value="{Binding IsOn, Mode=TwoWay}" />
         </Style>
    </DataGrid.RowStyle>
    

    【讨论】:

    • 到目前为止你帮了我很多,除非我还没有弄清楚我应该如何设置模型属性。到目前为止,我所做的是拥有一个 PersonVM 来保留 Person 模型的 ObsrvableCollection,然后我在 PersonVM 和绑定到 CurrentItem 属性的视图中有一个 CurrentItem。例如 。现在我需要知道我应该对你的设计做什么。
    猜你喜欢
    • 1970-01-01
    • 2019-08-29
    • 1970-01-01
    • 2022-01-15
    • 1970-01-01
    • 2013-08-27
    • 1970-01-01
    • 1970-01-01
    • 2019-06-07
    相关资源
    最近更新 更多