c# - 如何在 C# MVVM 中绑定(bind)一对多关系

标签 c# wpf xaml mvvm

我一直在开发 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/

相关文章:

wpf - 在 DatePicker 或 TimePicker XAML UAP 上设置宽度

c# - 使用 MVVM 限制 WPF 中绑定(bind)到 DataGrid 的属性

c# - 使用 CEFSharp Web 浏览器的 WPF 应用程序在 clickonce 版本中崩溃

c# - SendMessage 到 .NET 控制台应用程序

c# - GridView DevExpress 检查是否有任何单元格为空

c# - 在这种情况下嵌套 LINQ 查询?如何创建嵌套的groupby?

c# - 如何根据派生类字段过滤基类集合?

c# - DataGrid 放置的 WPF RowValidation 列

wpf - 捕获 WPF 运行时 BindingExpression 错误

WPF 使用 Canvas 作为 ImageSource