我一直在开发 Windows 窗体应用程序,并且不熟悉使用 MVVMLight 工具包和 WPF。
我的模型如下:
病人
身份证, 名, 姓, 等等……
测试结果
身份证,
分数,
日期,
患者编号,
等等……
每个患者可以有多个测试结果。在同一个 View (名为 GTPView)上,我想显示一个 Patients 列表框和一个 TestResults 列表框。当用户点击一个 Patient 时,该 Patient 的所有 TestResults 都应该出现在 TestResults 列表框中。
我知道如何将 Patients ListBox 的 SelectedItem 绑定(bind)到我的 GTPViewModel 中的 Patient 属性,但是如何将 TestResults ListBox 绑定(bind)到当前所选 Patient 的所有 TestResults?
我是否应该有一个 TestResults 列表框的 UserControl View 和一个 Patients 列表框的 UserControl View ,然后将这两个 UserControl 添加到我的 GTPView 中?或者最好只在一个 View 中完成所有操作?
提前致谢。如果您需要更多信息,请与我们联系。这是我的 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
集合的类。
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"/>
关于c# - 如何在 C# MVVM 中绑定(bind)一对多关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34661634/