如何使用多对多关系中的两个对象绑定到WPF View?

时间:2013-09-03 15:02:52

标签: c# wpf mvvm viewmodel observablecollection

鉴于我的数据访问层(使用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 View),每个报告都应显示其关键字的子列表视图。因此,这可以在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);
        }
    }

}

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

1 个答案:

答案 0 :(得分:0)

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

使用此视图模型,我会将Reports属性绑定到视图中的ListBox.ItemsSource,将Report属性绑定到ListBox.ItemsSource属性,以便用户可以选择各种报告对象。然后,您只需将ReportKeywords属性从选定的Report对象绑定到视图中的另一个ListBox

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

这应绑定到其他ReportKeywords中当前或所选项目的ListBox集合。