2

Entity Framework 4.1、WPF、および C# を使用する MVVM アプリケーションがあります。LoanListingView という名前のビューでデータグリッド (グリッドは LoanComparisons という名前のデータベースの EntitySet にバインドされます) から行をダブルクリックすると、別のビュー (という名前) に切り替わるように取得しようとしています。 LoanCalculatorView) は、選択された行で指定された情報によって、私のデータベース (Loans という名前の EntitySet) 内の情報を渡します。

これまでのところ、既にアプリを配線しているので、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 メソッドはそのメソッドに 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;

  }

留意すべきもう 1 つの点は、私の 2 つの EntitySet は 1 対多の関係にあるということです。1 つのローンと LoanComparisons のコレクション。選択した行 (LoanComparisons EntitySet のエンティティを表す) から LoanCalculatorView に情報を渡す方法を示すことは可能ですか?

4

2 に答える 2

0

頭痛の種を避けるための 1 つの提案は、Double-Click イベントを発生させるときに「現在の選択」について心配する必要がないように、データグリッドの SelectedItem プロパティにプロパティをバインドすることです。

あなたがしていることについて、私はそのように呼び出しを分解します:

  1. リストを設定できるように、最初のグリッド ビューに対して EF への最初の呼び出しを実行します。
  2. 主キーまたは一意の識別子のために各アイテムに Id があると仮定すると、その値のみを popup-window のパラメーターとして渡します。
  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 に答える