C# 使用实体框架和MVVM将数据库信息从一个视图模型传递到另一个视图模型

C# 使用实体框架和MVVM将数据库信息从一个视图模型传递到另一个视图模型,c#,wpf,xaml,entity-framework-4.1,C#,Wpf,Xaml,Entity Framework 4.1,我有一个使用实体框架4.1、WPF和C#的MVVM应用程序。我正在尝试获取它,以便当我在一个名为LoanListingView的视图中双击datagrid(网格绑定到数据库中名为LoanComparisons的EntitySet)中的一行时,它会切换到另一个视图(名为LoanCalculatorView),传递数据库中的信息(EntitySet名为Loans)根据所选行中给定的信息 到目前为止,我已经连接了该应用程序,因此双击LoanListingView数据网格中的一行将打开LoanCalcu

我有一个使用实体框架4.1、WPF和C#的MVVM应用程序。我正在尝试获取它,以便当我在一个名为LoanListingView的视图中双击datagrid(网格绑定到数据库中名为LoanComparisons的EntitySet)中的一行时,它会切换到另一个视图(名为LoanCalculatorView),传递数据库中的信息(EntitySet名为Loans)根据所选行中给定的信息

到目前为止,我已经连接了该应用程序,因此双击LoanListingView数据网格中的一行将打开LoanCalculator视图,该视图的默认值已输入到其字段中

现在来看一些代码。以下是绑定到名为LoanComparisons的数据库实体集的DataGrid:

       <DataGrid MouseDoubleClick="OnDoubleClick"  ItemsSource="{Binding Path=LoanComparisons}" 
                  AutoGenerateColumns="False" SelectionChanged="DataGrid_SelectionChanged">

            <DataGrid.Columns>
                <DataGridTextColumn IsReadOnly="True" Header="Customer Name" Binding="{Binding Path=Name}" />
                <DataGridTextColumn IsReadOnly="True" Header="Home Value" Binding="{Binding Path=HomeValue}" />
                <DataGridTextColumn IsReadOnly="True" Header="Monthly Income" Binding="{Binding Path=MonthlyIncome}" />
                <DataGridTextColumn IsReadOnly="True" Header="First Payment" Binding="{Binding Path=FirstPaymentDate}" />
            </DataGrid.Columns>
        </DataGrid>
目前,Open方法将null值传递到它的方法中,因为我不确定如何从另一个名为“Loans”的EntitySet传递信息。开放式方法如下:

//Creates a new LoanCalculatorViewModel that calls the SetComparisonDataRecord method
//passing it an argument comparison and changes the DataContext to LoanCalculatorView.
  public void Open(LoanComparison comparison)
  {
     var loanCalculatorViewModel = new LoanCalculatorViewModel();

     loanCalculatorViewModel.SetComparisonDataRecord(comparison);

     var loanCalculatorView = new LoanCalculatorView {DataContext = loanCalculatorViewModel};

     loanCalculatorView.Show();
  }
最后,SetComparisonDataRecord现在只是空的,但我对其中应该包含的内容以及我希望如何设置值进行了注释:

      public void SetComparisonDataRecord(LoanComparison comparison)
  {


     //SharedValues.HomeValue = comparison.HomeValue;

  }

还有一件事要记住,我的两个实体集有一对多的关系。一笔贷款和一系列贷款比较。是否可以向我演示如何将所选行(表示我的LoanComparisons EntitySet中的实体)的信息传递到LoanCalculator视图?

一个避免麻烦的建议是将属性绑定到datagrid的SelectedItem属性,这样您就不必担心“当前选择”在触发双击事件时

对于你正在做的事情,我将把这些电话细分如下:

  • 对初始网格视图执行对EF的第一次调用,以便填充列表
  • 假设由于主键或某个唯一标识符,每个项目都有一个Id,则仅将该值作为弹出窗口的参数传递
  • 在弹出窗口加载初始化期间加载viewmodel的过程中,使用LINQ为ID为“passed ID”的记录调用实体
  • 获取返回的实体POCO,将其存储在viewmodel的属性中,并在视图中访问它
  • 注意:确保在所有viewmodel属性上使用INotifyPropertyChanged,以便视图正确刷新

  • 这基本上就是您要寻找的吗?

    一个避免麻烦的建议是将属性绑定到datagrid的SelectedItem属性,这样在触发双击事件时就不必担心“当前选择”

    对于你正在做的事情,我将把这些电话细分如下:

  • 对初始网格视图执行对EF的第一次调用,以便填充列表
  • 假设由于主键或某个唯一标识符,每个项目都有一个Id,则仅将该值作为弹出窗口的参数传递
  • 在弹出窗口加载初始化期间加载viewmodel的过程中,使用LINQ为ID为“passed ID”的记录调用实体
  • 获取返回的实体POCO,将其存储在viewmodel的属性中,并在视图中访问它
  • 注意:确保在所有viewmodel属性上使用INotifyPropertyChanged,以便视图正确刷新

  • 这就是您想要的吗?

    像这样更改了我的OnDoubleClick方法,其中DataContext在Open方法中设置:

     private void OnDoubleClick(object sender, MouseButtonEventArgs e)
        {
            if (sender != null)
            {
                DataGrid grid = sender as DataGrid;
                if (grid != null && grid.SelectedItems != null && grid.SelectedItems.Count == 1)
                {           
                    var lc = grid.SelectedItem as LoanComparison;
                    if (lc != null) _viewModel.Open(lc);
    
                }
            }
        }
    
    public void Open(LoanComparison comparison)
      {
         var loanCalculatorViewModel = new LoanCalculatorViewModel();
    
         loanCalculatorViewModel.SetComparisonDataRecord(comparison);
    
         var loanCalculatorView = new LoanCalculatorView {DataContext = loanCalculatorViewModel};
    
         loanCalculatorView.Show();
      }
    
    简单开放式方法:

     private void OnDoubleClick(object sender, MouseButtonEventArgs e)
        {
            if (sender != null)
            {
                DataGrid grid = sender as DataGrid;
                if (grid != null && grid.SelectedItems != null && grid.SelectedItems.Count == 1)
                {           
                    var lc = grid.SelectedItem as LoanComparison;
                    if (lc != null) _viewModel.Open(lc);
    
                }
            }
        }
    
    public void Open(LoanComparison comparison)
      {
         var loanCalculatorViewModel = new LoanCalculatorViewModel();
    
         loanCalculatorViewModel.SetComparisonDataRecord(comparison);
    
         var loanCalculatorView = new LoanCalculatorView {DataContext = loanCalculatorViewModel};
    
         loanCalculatorView.Show();
      }
    
    在此基础上,我编写了一个基本查询,询问数据库中的“贷款”实体:


    抱歉给你添麻烦了!感谢您的帮助:)

    像这样更改了我的OnDoubleClick方法,其中DataContext在Open方法中设置:

     private void OnDoubleClick(object sender, MouseButtonEventArgs e)
        {
            if (sender != null)
            {
                DataGrid grid = sender as DataGrid;
                if (grid != null && grid.SelectedItems != null && grid.SelectedItems.Count == 1)
                {           
                    var lc = grid.SelectedItem as LoanComparison;
                    if (lc != null) _viewModel.Open(lc);
    
                }
            }
        }
    
    public void Open(LoanComparison comparison)
      {
         var loanCalculatorViewModel = new LoanCalculatorViewModel();
    
         loanCalculatorViewModel.SetComparisonDataRecord(comparison);
    
         var loanCalculatorView = new LoanCalculatorView {DataContext = loanCalculatorViewModel};
    
         loanCalculatorView.Show();
      }
    
    简单开放式方法:

     private void OnDoubleClick(object sender, MouseButtonEventArgs e)
        {
            if (sender != null)
            {
                DataGrid grid = sender as DataGrid;
                if (grid != null && grid.SelectedItems != null && grid.SelectedItems.Count == 1)
                {           
                    var lc = grid.SelectedItem as LoanComparison;
                    if (lc != null) _viewModel.Open(lc);
    
                }
            }
        }
    
    public void Open(LoanComparison comparison)
      {
         var loanCalculatorViewModel = new LoanCalculatorViewModel();
    
         loanCalculatorViewModel.SetComparisonDataRecord(comparison);
    
         var loanCalculatorView = new LoanCalculatorView {DataContext = loanCalculatorViewModel};
    
         loanCalculatorView.Show();
      }
    
    在此基础上,我编写了一个基本查询,询问数据库中的“贷款”实体:

    抱歉给你添麻烦了!谢谢你的帮助:)

    谢谢:)需要一些编码伙伴的帮助才能帮到我。我会发布我的答案谢谢:)需要一些编码伙伴的帮助才能帮到我。我会发布我的答案