3

鉴于我的数据访问层中存在多对多关系(使用 CodeFirst - EF),例如

public class Report{
   public int ReportId {get;set;}
   public string ReportName {get;set;}
   public List<ReportKeyword> ReportKeywords {get;set;}
}

public class ReportKeyword{
   public int ReportId {get;set;}
   public int KeywordId {get;set;}
}

public class Keyword{
   public int KeywordId {get;set;}
   public string KeywordName {get;set;}
   public List<ReportKeyword> ReportKeywords {get;set;}
}

我需要创建一个显示报告列表视图的用户界面(WPF 视图),并且每个报告都应显示其关键字的子列表视图。因此,这可以在 ViewModel 中轻松完成,但为此目的对 ViewModel 进行建模的最佳方式是什么。我是否需要创建具有必要属性的 VM?这是一个 ReportViewModel,它具有我想要在报表对象之外显示的所有类似属性,包括一组关键字。

public class ReportViewModel : ViewModelBase<ReportViewModel>
{
    private string _reportName;
    public string ReportName
    {
        get { return _reportName; }
        set
        {
            _reportName = value;
            NotifyPropertyChanged(model => model.ReportName);
        }
    }
    private ObservableCollection<Keyword> _keywords;
    public ObservableCollection<Keyword> Keywords
    {
        get { return _keywords; }
        set
        {
            _keywords = value;
            NotifyPropertyChanged(model => model.Keywords);
        }
    }

}

我觉得有点乏味。如何填充集合以显示在网格上?是否应该在选择报表时调用设置关键字集合的方法?这种情况有更好的解决方案吗?

4

1 回答 1

0

在我个人看来,你似乎几乎已经在那里了。但是,我会为视图模型提供一个Report对象集合,一个类型的单一属性Report以绑定到SelectedItem集合控件的属性,而不是Keyword您已经拥有的对象集合。

使用此视图模型,我会将Reports属性绑定到ListBox.ItemsSource视图中的a 并将属性绑定ReportListBox.ItemsSource属性,以便用户可以选择各种报表对象。然后,您可以简单地将ReportKeywords所选Report对象的属性绑定到ListBox视图中的另一个:

<ListBox ItemsSource="{Binding Reports/ReportKeywords}" />

这应该绑定到ReportKeywords另一个中的当前或选定项目的集合ListBox

于 2013-09-03T15:23:36.843 回答