2011-10-26 42 views
0

我在我的ParentView(DashboardConsultants)中顯示了一個GridView,它顯示了當用戶的鼠標指針懸停在單元格上時的自定義工具提示。該工具提示顯示View(AgreementDetails_View),其顯示綁定到該單元的協議的信息。我會告訴我現在有代碼,這樣就可以更好地理解我的問題:從父視圖傳遞信息到子視圖

DataGrid單元格中ParentView:

<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:

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); 
      } 
     } 

正如您現在所看到的,方法總是調用相同的協議(我爲了測試目的而做),但現在我想要在DataGrid Cell Tag中指定的協議(本例中爲Months[9].AgreementID)。我可以把它給我的子視圖的構造函數中的ViewModel,但我不認爲這是允許由於MVVM模式(或允許?)。

所以我的問題是:如何將我的ParentView中指定的AgreementID傳遞給ChildView的ViewModel以獲取ChildView的正確數據?

Ofcourse,更多信息/代碼/澄清可以愉快地提供,只問:)

提前感謝!

回答

1

不知道,我有問題在右擊的方式,但我的感覺像你需要通過引用傳遞迴父本身

+0

我也想過命令來查看,但我不能在工具提示屬性來定義一個命令(我可以在那裏調用Month []。AgreementID),或者你建議將Command放在別的地方嗎? –

+0

問題是爲什麼父視圖顯示協議的細節?爲什麼AgreementView沒有這樣做(它實際上與AgreementViewModel綁定,因爲它提供了udnerlying協議)? – sll

+0

你是什麼意思? ParentView有一個gridd,每個單元格包含一個AgreementID。當我將鼠標懸停在單元格上時,它顯示包含該協議的更多信息的View的工具提示(不僅僅是AgreementID) –

0

使用,而不是引入綁耦合命令這是pefectly合法有效在該ID eitehr通過傳遞一個構造函數或通過一個屬性。我不確定你的代碼,但是如果你的父類是可以訪問你的模型的父類,你也可以將模型傳遞給你的視圖模型(即通過構造函數,屬性或方法)。

有一件事我經常這樣做在這種情況下是添加屬性,如我父母的視圖模型如下:

object ActiveItem {get;set;} 

我然後綁定該ActiveItem到ActiveItem在我的網格。

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

因此,您建議將ID綁定到ParentViewModel,然後將其傳遞給ChildViewModel,它將正確的信息傳遞給ChildView?這是有道理的,我如何將活動DataGrid單元(使用其ID)綁定到ActiveItem屬性? –

+0

假設這是您正在討論的默認WPF數據網格,您可以將ViewModel中的ActiveItem屬性綁定到[SelectedItem](http://msdn.microsoft.com/zh-cn/library/system.windows.controls。 primitives.selector.selecteditem.aspx)網格上的屬性 – Damian

+0

工具提示顯示當我將鼠標懸停在單元格上,而不是當我選擇它(單擊它)時,它仍然工作,然後與SelectedItem綁定? –

1

我個人覺得WPF意見應該是沒有什麼比ViewModel的漂亮反射更多。所以View實際上不應該傳遞任何數據到ViewModels - 而應該反映ViewModel的數據。

就你而言,我會附加一個屬性到每個DataGrid行中顯示的對象。例如,如果你的DataGrid中包含Agreement對象,我會確保每個Agreement對象有一個屬性叫做AgreementDetails可以從ToolTip

+0

Parent ViewModel沒有協議對象,只有帶ID的對象,比如我的問題示例中的Month [9] .AgreementID –

+0

@JelleCapenberghs你的DataGrid綁定了什麼? – Rachel

+0

DataGrid的ItemsSource綁定到一個模型(在我的情況下是一個WCF合約),其中包含有關協議顧問,當前狀態以及包含所有月份信息的合同列表 –

相關問題