簡體   English   中英

如何在C#MVVM中綁定一對多關系

[英]How to Bind a One To Many Relation in C# MVVM

我一直在開發Windows Forms應用程序,並且是使用MVVMLight Toolkit和WPF的新手。

我的模型如下:

患者

Id,FirstName,LastName等...

測試結果

ID,分數,日期,
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>

您的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集合的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"/>                 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM