2

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

到目前为止,我已经连接了应用程序,因此双击 LoanListingView DataGrid 中的一行会打开 LoanCalculatorView,该视图具有已输入到其字段中的默认值。

现在来看一些代码。这是绑定到名为 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>

双击任何一行会打开我的 LoanCalculatorView 并带有预设值。当前 DoubleClick 事件运行此代码:

      /// Handles double-clicks on datagrid rows
    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)
            {
                DataGridRow dgr = grid.ItemContainerGenerator.ContainerFromItem(grid.SelectedItem) as DataGridRow;
              _viewModel.Open(null);


              //The DataContext will be set to dgr but since "DataGridRow"
              //does not contain the Open method I cant do this:
              //  DataContext = dgr;
              //dgr.Open(dgr);
              //
              //I think this is where I am lost at

            }
        }
    }

目前,Open 方法将一个空值传递给它的方法,因为我不确定如何从我的另一个名为“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;

  }

要记住的另一件事是,我的两个 EntitySet 具有一对多的关系。一笔贷款和一组 LoanComparisons。是否可以向我展示如何将所选行中的信息(代表我的 LoanComparisons EntitySet 中的实体)传递给 LoanCalculatorView?

4

2 回答 2

0

避免头疼的一个建议是将属性绑定到数据网格的 SelectedItem 属性,这样您在触发 Double-Click 事件时就不必担心“当前选择”。

对于你正在做的事情,我会这样分解电话:

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

这基本上是您正在寻找的吗?

于 2012-06-24T18:35:32.340 回答
0

像这样更改了我的 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();
  }

从那里我写了一个基本查询,询问我的数据库中的“贷款”实体:

public void SetComparisonDataRecord(LoanComparison comparison)
           {

     var calcEntities = new LoanCalcEntities();

     var currentLoan = from loan in calcEntities.Loans
                       where loan.LoanId == comparison.CurrentLoanId
                       select loan;


     var proposedLoan = from loan in calcEntities.Loans
                       where loan.LoanId == comparison.ProposedLoanId
                       select loan;

     //SharedValues.HomeValue = comparison.HomeValue;

  }

抱歉,添麻烦了!谢谢您的帮助 :)

于 2012-06-26T07:42:25.163 回答