Also meine App ist im Grunde eine Shell mit einer ContentControl
, die ich mit benutzerdefinierten UserControl
's auffüllen je nach der Benutzerauswahl eines Menüs.KeyBinding inkrementieren seine Befehlsaufrufe
Aber jetzt habe ich ein seltsames Verhalten.
Ich hatte die Content
Eigenschaft der ContentControl
an eine ViewModel-Eigenschaft angeschlossen, die ich bei Bedarf instanziiere. Das funktioniert großartig, aber ich habe zwei Probleme.
Wenn ich eine Option im Menü auswählen erstellt es eine neue Instanz der angegebenen
UserControl
und stellen Sie dieContent
Eigenschaft, um die Schale. Das funktioniert, weil ich das Steuerelement sehe und mit ihm interagieren kann, und wenn ich eine andere Option aus dem Menü wähle, zeigt es mir die andereUserControl
, aber, wenn ich wieder die vorher gewählte Option wähle, scheint es das gleiche zuvor zu laden Kontrolle (der rechte aber mit dem älteren Eingang, und ich bin ein neues xxxcontrol() zu tun, bevor es alsContent
Eigenschaft desContentControl
Einstellung.ich bin ein Showdialog() aufrufen, aus dem Inneren des Custom Controls über Commands (aus dem User-Control-View-Modell rufe ich die View über MVVM Light messaging auf und zeige dann den Dialog an), und das funktioniert. Aber wenn ich versuche, den Dialog zu schließen, zeige ich ihn wieder genauso oft an das Menü
Zum Beispiel, ich beginne mit A-Menü und zeige den Dialog, dann die Schließen-Taste funktioniert, dann gehe ich zu B-Menü und zurück zu A, dann die Schließen-Taste funktioniert beim zweiten Drücken (zwei ShowDialog() werden genannt) und so weiter ...
Ich weiß nicht, welchen Teil des Codes ich einfügen muss, um diesem Beitrag ein wenig mehr Kontext zu geben, aber jede Eingabe wird geschätzt. Ich stecke mit diesem (meinen) Fehler fest.
-Code
Auf der Schale Ansicht:
<ContentControl Grid.Row="2" Content="{Binding CurrentView}" Margin="15,10"/>
Auf der Schale Ansichtsmodell:
if (action == null || action == SEARCH_ACTION)
{
ActionsMenuSelected = SEARCH_ACTION;
var view = new SearchDocumentView();
CurrentView = view;
}
Auf der Innenansicht (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();
}
}
Auf der Innenansicht (SearchDocumentView) XAML:
<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>
...
Auf der Innenansicht (SearchDocumentView) Ansichtsmodell:
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));
}
}
Fügen Sie den XAML-Code ein, an dem Sie den Inhalt und den Code für die Instanziierung der Benutzersteuerelemente festlegen. Auch das Code-Snippet, in dem Sie ShowDialog() aufrufen. –
@SreedharlalBNaick Just Edited meine Antwort. Vielen Dank. –