2011-10-25 11 views
2

私はMVVMに少し問題があります。最初に私の問題を描きましょう。ViewModelは必要になる前にインスタンス化します

データグリッドを持つ親ビュー(DashboardConsultants)があります。そのデータグリッド内の各セルは、ツールチップは、このように実装しています

<UserControl.Resources> 
     <ResourceDictionary> 
      <DataTemplate DataType="{x:Type vm:UC1001_AgreementDetailsViewModel}"> 
       <v:UC1001_AgreementDetails_View /> 
      </DataTemplate>  
     </ResourceDictionary> 
</UserControl.Resources> 

<DataGridTextColumn.ElementStyle> 
     <Style TargetType="{x:Type TextBlock}"> 
     <Setter Property="DataGridCell.ToolTip"> 
       <Setter.Value> 
        <vm:UC1001_AgreementDetailsViewModel /> 
       </Setter.Value> 
     </Setter> 

ツールチップには、次のコードを持っている私のViewModel(AgreementDetailsViewModel)を、呼び出し:

public UC1001_ActiveAgreementContract AgreementDetailsContract { get; set; } 

public int AgreementID { get; set; } 

public UC1001_AgreementDetailsViewModel() 
{ 
    AgreementDetailsContract = new UC1001_ActiveAgreementContract(); 
    this.Initialize(); 
} 

private void Initialize() 
{ 
    GetRefData(); 
    ShowAgreementDetailsView(); 
} 

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


private void ShowAgreementDetailsView() 
{ 
    // Initialize 
    var regionManager = ServiceLocator.Current.GetInstance<IRegionManager>(); 

    // Show content 
    var agreementDetailsWorkspace = new Uri("UC1001_AgreementDetails_View", UriKind.Relative); 
    regionManager.RequestNavigate("ContentRegion", agreementDetailsWorkspace); 
} 

のViewModelの目標はありますデータベース(現在は静的なもの)から契約を取得し、それを子ビュー(UC1001_AgreementDetails_View)に渡してツールチップとして表示します。コントロールが契約に特異的に結合することができるように、子ビューには、次のコンストラクタを持っています

public UC1001_AgreementDetails_View(ViewModels.UC1001_AgreementDetailsViewModel UC1001_AgreementDetailsViewModel) 
    {    
     InitializeComponent(); 
     this.DataContext = UC1001_AgreementDetailsViewModel.AgreementDetailsContract; 
    } 

私はViewModelに初期化にブレークポイントを置いて、私は親ビューに乗るときには発火するが、私が取得するときには、発射すべきです子ビューで(したがって、DataGridでツールチップを開くとき)。誰も私がこれをどのように修正できるか知っていますか?

必要に応じて、より多くの情報やコードを提供することができます。

EDITは:

は、私はいくつかのものを試してみましたが、私は今、私は(私は解決策に少し近い感じ)このようなものを得ました。私の子ビューで

<Setter Property="DataGridCell.ToolTip"> 
      <Setter.Value> 
       <v:UC1001_AgreementDetails_View DataContext="{Binding AgreementDetailsViewModel}" /> 
      </Setter.Value> 
</Setter> 

、私はプロパティがあり、次の結合今

<Label Content="{Binding AgreementDetailsContract.Header}" Height="50" HorizontalAlignment="Left" Margin="8,6,0,0" Name="_labelHoofding" VerticalAlignment="Top" FontSize="22" /> 

私AgreementDetailsViewModelを、置く:

は、私は、次の(Rachelsのヘルプによる)に私のツールチップを変更しました私が表示したいすべての情報を持つ、AgreementDetailsContractという名前の子ビューは、私の子ビューのDataContextです。しかし、私の問題はまだ残っています。 ContractDetailsViewModelsは、コンサルタントダッシュボードを開いたときに起動します(ツールチップの表示時に開きます)。 ViewModelを起動するためのツールチップを置くことができる何らかのイベント/コマンドがありますか?また、情報を表示しないため、ラベルのバインディングに問題があると思います(ViewModelが正しい情報を渡していないのと同じですが)。

もう少し複雑に見える場合は、さらに説明していただくか、尋ねられればさらにコードを提供します。

は解決:

を、私は解決策を得ました。 XAMLの代わりにChildViewのコンストラクターまたはビューのツールチップにバインディングを指定します。

public UC1001_AgreementDetails_View() 
    { 
     InitializeComponent(); 
     this.DataContext = new UC1001_AgreementDetailsViewModel(); 
    } 
+4

フレームワーク設計ガイドラインのコピーを作成してください。あなた自身を読むか、あなたのタイプの名前の形を決めた人を打ち負かすかのどちらかです。また、もっと深刻なことに、あなたの問題を再現する非常に単純なプロトタイプを作ろうとしましたか?あなたはいくつかの異なる方法で壊れるかもしれない複雑なものをたくさんしているようだ... – Will

+0

機能の一般的なアイデアはそんなに難しくありません。 ViewModelから来るデータをツールチップとして表示するだけです。これは私がWPFとMVVMを使用するのは初めてですので、これを自分自身で解決する方法は実際にはわかりません:) –

+1

ツールチップは論理ツリーの外に存在するため、期待どおりにDataContextを継承しません。それがあなたの問題の根源かどうかを判断するのに十分な時間をかけて質問を調べることはできません。あなたはここでデータバインディングツールチップを検索し、この問題に関する多くの質問を見つけることができます。私は主題についていくつかの回答を投稿したと思います... – Will

答えて

3

あなたのビューで直接それが

を起動したときにこのコード

<Setter Property="DataGridCell.ToolTip"> 
    <Setter.Value> 
     <vm:UC1001_AgreementDetailsViewModel /> 
    </Setter.Value> 
</Setter> 

であるべきそれはあなたのViewModelのコピーを作成することを意味しており、ViewModelにを参照しているように見えます
<Setter Property="DataGridCell.ToolTip"> 
    <Setter.Value> 
     <!-- If you want to keep the DataTemplate, use a ContentControl --> 
     <v:UC1001_AgreementDetails_View DataContext="{Binding AgreementDetails}" /> 
    </Setter.Value> 
</Setter> 

データ構造は次のようになります。

class MainViewModel 
{ 
    ObservableCollection<AgreementViewModel> Agreements; 
} 

class AgreementViewModel 
{ 
    // Loaded only when getter is called 
    AgreementDetailViewModel AgreementDetails; 
} 
+0

+1これは明らかな答えです! – Venemo

+0

私はいくつかのものを試し、私の答えを更新しました。 –

+0

私は解決策を得た、私の質問を確認します。私はあなたの答えを受け入れるようにしています。ありがとう! –

関連する問題