2012-04-03 5 views
0

私のアプリは、基本的には、ユーザのメニュー選択に応じて、UserControlのカスタムを設定したContentControlのシェルです。KeyBindingのコマンド呼び出しを増やす

しかし、今私は奇妙な動作をしています。

ContentControlContentプロパティを、必要に応じてインスタンス化するViewModelプロパティに関連付けました。それは素晴らしいですが、私は2つの問題を抱えています。

  1. 私はメニューの1つのオプションを選択すると、指定UserControlの新しいインスタンスを作成し、Contentプロパティにシェルを設定します。それは動作し、私はコントロールを参照して、それと対話することができますし、メニューから別のオプションを選択すると、別のUserControlが表示されますが、previosly selectedオプションを選択すると、コントロール(右のいずれかが、古いの入力と、と私はContentControlContentプロパティとして設定する前に、新しいXXXControlを()やっている。

  2. 私はカスタムコントロールの内部からにShowDialog()を呼んでいます私はMVVM Lightメッセージを介してビューを呼び出してダイアログを表示します。)しかし、私はダイアログを閉じようとすると、同じ数の時間を別のオプションから選択して表示しますメニュー。

たとえば、Aメニューから開始してダイアログを表示してから閉じるボタンを押してからBメニューに戻り、Aボタンを押すと2番目のプレスで閉じるボタンが表示されます(2つのShowDialog()と呼ばれる)...

このポストに文脈をもう少し与えるためにコードの一部を貼り付けなければならないことはわかりませんが、入力があれば分かります。私はこの(私の)バグに悩まされています。

シェルビュー上のコード

:シェル・ビューモデルで

<ContentControl Grid.Row="2" Content="{Binding CurrentView}" Margin="15,10"/> 

:内視で

if (action == null || action == SEARCH_ACTION) 
    { 
     ActionsMenuSelected = SEARCH_ACTION; 
     var view = new SearchDocumentView(); 
     CurrentView = view; 
    } 

(SearchDocumentView):

public SearchDocumentView() 
{ 
    InitializeComponent(); 
    Messenger.Default.Register<NotificationMessage<Entity>>(this, NotificationMessageReceived); 
} 


private void NotificationMessageReceived(NotificationMessage<Entity> msg) 
{ 
    if (msg.Notification == "ViewResult") 
    { 
     var view = new DocumentViewer(ServiceLocator.Current.GetInstance<IDataService>(),msg.Content); 
     view.ShowDialog(); 
    } 
} 
インナービュー(SearchDocumentView)のViewModelに

<ListBox x:Name="SearchResults" ItemsSource="{Binding SearchResults}" SelectedItem="{Binding SelectedSearchResult}"> 
      <ListBox.InputBindings> 
       <KeyBinding 
          Key="Enter" 
          Command="{Binding ViewResult}" /> 
       <KeyBinding 
          Key="Return" 
          Command="{Binding ViewResult}" /> 
      </ListBox.InputBindings> 
      ... 

:インナービュー(SearchDocumentView)XAMLで

private RelayCommand _viewResut; 

     /// <summary> 
     /// Gets the ViewResult. 
     /// </summary> 
     public RelayCommand ViewResult 
     { 
      get 
      { 
       return _viewResut 
        ?? (_viewResut = new RelayCommand(
             () => 
              { 
               MessengerInstance.Send(new NotificationMessage<Entity>((Entity)SelectedSearchResult, "ViewResult")); 
              }, 
             () => ((Entity)SelectedSearchResult!=null)?true:false)); 
      } 
     } 
+0

xamlコードを貼り付けます。ここでは、コンテンツを設定し、usercontrolをインスタンス化するコードを設定します。また、ShowDialog()を呼び出すコードスニペット。 –

+0

@SreedharlalBNaickちょうど私の答えを編集しました。ありがとう。 –

答えて

1

あなたは古いデータを参照してくださいなぜ私は今見ることができない - 私はあなたを推測新しく作成されたビューに同じ(モデル)データを使用します。

第二の問題は、ここでは次のようになります。それぞれの新しいビューの

public SearchDocumentView() 
{ 
    InitializeComponent(); 
    Messenger.Default.Register<NotificationMessage<Entity>>(this, NotificationMessageReceived); 
} 

ご登録あなたのメッセージボックスが表示されますが、あなたはそれらの登録を解除する場合、私は見ていないし、そうでない場合の通知、ハンドラはメモリ内にviewmodelを保持し、メッセージボックスを表示します。私はそれが間違って持っていても

(これはあなたの「コントロール」-viewmodelているのですか?)それは非常によく似たものになるはずですが、あなたはあなたのメッセージに.Showにブレークポイントを設定し、コールスタックの中を見て、これを簡単に見つけることができますデバッグ

+0

ありがとうございます@カルステン、実際にはあなたが正しいです。私はViewModelを解決するためにIoCコンテナを使用していたので、同じインスタンスを使用していました。さて、2番目の問題では、ビューの登録を解除する方法を正確にはわかりません(ビューモデルの登録を解除することがどのように役立つか分かりません)。 –

+1

こんにちは、私が覚えている限り(ここではコードはありません)、 'IMessenger'(?)インターフェースに' Unregister'メソッドがあるはずです(したがって、 'Messenger.Default'でも受取人それは 'Messenger.Default.Unregister(あなた)の見解では')と - それはここに:http://blog.galasoft.ch/archive/2009/09/27/mvvm-light-toolkit-messenger-v2-beta .aspx – Carsten

+0

備考:ブログエントリは、MVVM-lightは弱参照を使用するため、表示される「メッセージ」の数は、サイドノードと同様に時間の経過とともに減少するはずであることを示しています。 – Carsten

関連する問題