如何在C#MVVM中绑定一对多关系

时间:2016-01-07 17:36:03

标签: c# wpf xaml mvvm

我一直在开发Windows Forms应用程序,并且是使用MVVMLight Toolkit和WPF的新手。

我的模型如下:

患者

标识, 名字, 姓, 等...

TestResult中

标识, 得分了, 日期,
PatientId, 等...

每位患者可以有多个TestResults。在同一个视图(名为GTPView)上,我想显示一个患者列表框和一个TestResults列表框。当用户点击患者时,所有患者的TestResults都应出现在TestResults列表框中。

我知道如何将Patient ListBox的SelectedItem绑定到来自我的GTPViewModel的Patient属性,但是如何将TestResults ListBox绑定到当前所选患者的所有TestResults?

我是否应该拥有TestResults列表框的UserControl视图和患者列表框的UserControl视图,然后将这些UserControl添加到我的GTPView?或者最好只在一个视图上完成所有操作?

提前致谢。如果您需要更多信息,请与我们联系。这是我的GTPView的XAML:

<Window x:Class="ApuntaNotas.Views.GTPView"            
        Title="GTP"            
        DataContext="{Binding GTP, Source={StaticResource Locator}}"
        d:DataContext="{d:DesignData /SampleData/PatientsViewModelSampleData.xaml}">
    <Window.Resources>
        <CollectionViewSource Source="{Binding Patients}" x:Key="PatientsVS">
            <CollectionViewSource.SortDescriptions>
                <ComponentModel:SortDescription PropertyName="Name" />
            </CollectionViewSource.SortDescriptions>
        </CollectionViewSource>
    </Window.Resources>
    <DockPanel>
        <ListBox DockPanel.Dock="Left" ItemsSource="{Binding Source={StaticResource PatientsVS}}"
                 x:Name="listBoxPatients" SelectedItem="{Binding SelectedPatient}" DataContext="{Binding}"
                 DisplayMemberPath="">
        </ListBox>
        <ListBox DockPanel.Dock="Right" ItemsSource="{Binding Source={StaticResource PatientsVS}}"
                 x:Name="listBoxTestResults"  DataContext="{Binding}"
                 DisplayMemberPath="">
        </ListBox>

    </DockPanel>
</Window>

1 个答案:

答案 0 :(得分:5)

您的PatientViewModel应该是这样的

public class PatientViewModel: INotifyPropertyChanged
    {
       public int ID {get; set;}
       public string FirstName {get; set;}
       public string LastName {get; set;}
       //Each patient has a set of test results, so we create a list.
       public  List<TestResult> PatientTestResults {get; set;}
    }

你应该再增加一个包含PatientViewModel集合的课程。

    public class AllPatients
    {
        public ObservableCollection<PatientViewModel> AllPatients{get; set;}
        public PatientViewModel SelectedPatient {get; set;}
    }

您的Window类现在应该如下所示

  <ListBox x:Name="listBoxPatients" 
           ItemsSource="{Binding  AllPatients}"
           SelectedItem="{Binding SelectedPatient}"
           IsSynchronizedWithCurrentItem="True"/>

  <ListBox x:Name="listBoxTestResults"
           ItemsSource="{Binding SelectedPatient.TestResults}"
           IsSynchronizedWithCurrentItem="True"/>