2011-10-26 20 views
0

私はParentView(DashboardConsultants)に、ユーザーのマウスポインターがセル上にホバーされたときにカスタムツールチップを表示するグリッドビューを持っています。ツールチップには、そのセルにバインドされた契約の情報を表示するビュー(AgreementDetails_View)が表示されます。 ParentViewに親ビューから子への情報を渡すViewModel

DataGridのセル:

<DataGridTextColumn Header="Okt" Width="*" x:Name="test"> 
    <DataGridTextColumn.ElementStyle> 
     <Style TargetType="{x:Type TextBlock}">         
      <Setter Property="Tag" Value="{Binding Months[9].AgreementID}"/> 
      <Setter Property="Background" Value="White" /> 
      <Setter Property="DataGridCell.ToolTip" > 
       <Setter.Value> 
        <v:UC1001_AgreementDetails_View Background="#FFF" Opacity="0.88" /> 
       </Setter.Value> 
      </Setter> 

マイChildView:ViewModelにで

public UC1001_DashBoardConsultants_View(UC1001_DashboardConsultantViewModel viewModel) 
     { 
      InitializeComponent(); 
      this.DataContext = viewModel; 
     } 

、私は方法を以下している私はあなたがよりよい私の質問を理解できるように、私が今持っているコードを表示しますデータベースから正しい合意を得るために:

private void GetRefData() 
     { 
      UC1001_ActiveAgreementArguments args = new UC1001_ActiveAgreementArguments(); 
      args.AgreementID = 3; 
      DefaultCacheProvider defaultCacheProvider = new DefaultCacheProvider(); 
      if (!defaultCacheProvider.IsSet("AgrDet:" + args.AgreementID)) 
      { 
       ConsultantServiceClient client = new ConsultantServiceClient(); 

       AgreementDetailsContract = client.GetAgreementDetailsByAgreementID(args); 
       defaultCacheProvider.Set("AgrDet:" + args.AgreementID, AgreementDetailsContract, 5); 
      } 
      else 
      { 
       AgreementDetailsContract = (UC1001_ActiveAgreementContract)defaultCacheProvider.Get("AgrDet:" + args.AgreementID); 
      } 
     } 

今のところわかるように、メソッドは常に同じアグリーメントを呼び出します(私はテスト目的でこれを行いました)が、今ではIDがDataGridのセルタグで指定されたアグリーメントを望みます(この例ではMonths[9].AgreementIDです)。

子ビューのコンストラクタのViewModelに渡すことはできますが、MVVMパターンのため許可されていないと思われます(または許可されていますか?)。

私の質問は:ChildViewのViewModelにParentViewで指定されたAgreementIDを渡して、ChildViewの正しいデータを取得するにはどうすればいいですか?

勿論、より多くの情報/コード/明確化は喜んでばかり事前に:)

感謝を聞いて、提供することができます!私はRIGH方法で質問を得たが、あなたのような私の気持ちは、親自身

答えて

1

わからないそれはeitehrを経由してそのIDを渡すpefectly法的および有効ですコンストラクタまたはプロパティを使用します。あなたのコードからはわかりませんが、親がモデルにアクセスできる場合は、モデルをビューモデルに渡すこともできます(コンストラクタ、プロパティ、メソッドなど)。私はよく、この場合に行う

ことの一つは、このような私の親のViewModelにに次のようにプロパティを追加することです:

object ActiveItem {get;set;} 

私はその後、私のグリッドにActiveItemにそのActiveItemをバインドします。

<DataGrid SelectedItem="{Binding ActiveItem}"> 
</DataGrid> 
+0

私も、コマンドの考えが、私は(ツールチップのプロパティでコマンドを定義することはできませんから見ることができAgreementDetailsというプロパティを持っていたことを確実にするでしょう私はMonth []。AgreementIDと呼ぶことができます)、あるいはあなたは他の場所にコマンドを置くことをお勧めしますか? –

+0

親ビューで契約の詳細を表示するのはなぜですか?なぜ、AgreementViewはこれをしないのですか(実際には、契約を守るための参照を持つAgreementViewModelと結びついています)? – sll

+0

どういう意味ですか? ParentViewにはグリッドがあり、各セルにはAgreementIDが含まれています。セルの上にマウスポインタを置くと、(AgreementIDだけでなく)その契約の詳細情報を含むビューのツールチップが表示されます –

0

への参照をバック渡すことによって、代わりに結ばカップリングを導入するコマンドを使用する必要があること

+0

IDをParentViewModelにバインドし、それをChildViewModelに渡して、正しい情報をChildViewに渡すことをお勧めしますか?それは理にかなっています。アクティブなDataGridセル(ID付き)をActiveItemプロパティにバインドするにはどうすればいいですか? –

+0

これはあなたが話しているデフォルトのWPFデータグリッドであると仮定して、ViewModelのActiveItemプロパティを[SelectedItem](http://msdn.microsoft.com/en-us/library/system.windows.controls)にバインドできます。 primitives.selector.selecteditem.aspx)プロパティ – Damian

+0

セルを選択したとき(クリックしていないとき)ではなく、SelectedItemバインディングを使用してもツールヒントが表示されます。 –

1

個人的には、私はWPFビューがViewModelをかなり反映している必要があると感じています。したがって、Viewは実際にはViewModelsにデータを渡すべきではなく、ViewModelのデータを反映する必要があります。

あなたのケースでは、各DataGrid行に表示されるオブジェクトにプロパティを添付します。あなたのデータグリッドがAgreementオブジェクトが含まれている場合たとえば、私は、各AgreementオブジェクトがToolTip

+0

親ViewModelには、私の質問の例のMonth [9] .AgreementIDのようなIDを持つオブジェクトのみが含まれています。 –

+0

@ JelleCapenberghs DataGridは何にバインドされていますか? – Rachel

+0

DataGridのItemsSourceは、契約のコンサルタント、現在の月のステータス、およびすべての月の情報を含む契約のリストに関する一部の情報を含むモデル(私の場合はWCF契約)にバインドされています –

関連する問題