私のアプリは、基本的には、ユーザのメニュー選択に応じて、UserControl
のカスタムを設定したContentControl
のシェルです。KeyBindingのコマンド呼び出しを増やす
しかし、今私は奇妙な動作をしています。
ContentControl
のContent
プロパティを、必要に応じてインスタンス化するViewModelプロパティに関連付けました。それは素晴らしいですが、私は2つの問題を抱えています。
私はメニューの1つのオプションを選択すると、指定
UserControl
の新しいインスタンスを作成し、Content
プロパティにシェルを設定します。それは動作し、私はコントロールを参照して、それと対話することができますし、メニューから別のオプションを選択すると、別のUserControl
が表示されますが、previosly selectedオプションを選択すると、コントロール(右のいずれかが、古いの入力と、と私はContentControl
のContent
プロパティとして設定する前に、新しいXXXControlを()やっている。私はカスタムコントロールの内部からに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));
}
}
xamlコードを貼り付けます。ここでは、コンテンツを設定し、usercontrolをインスタンス化するコードを設定します。また、ShowDialog()を呼び出すコードスニペット。 –
@SreedharlalBNaickちょうど私の答えを編集しました。ありがとう。 –