2017-01-15 4 views
0

Ich versuche, die Mahapps-Dialogfelder in meinem Projekt zu verwenden, konnte sie jedoch nicht durch einen ReactivUI-Befehl in meinem ViewModel ausführen.Im XAML der Ansicht Ich habe den Dialog registriert.Probleme beim Anzeigen eines Mahapps.Metro-Dialogfelds mit einem ReactiveU-Befehl

xmlns:dialogs="clr-namespace:MahApps.Metro.Controls.Dialogs;assembly=MahApps.Metro" 
    dialogs:DialogParticipation.Register="{Binding}" 

Ich habe auch eine Schaltfläche, die an den ShowDialog-Befehl gebunden ist.

this.BindCommand(viewModel, vm => vm.ShowDialog, x => x.button); 

schließlich in meinem Viewmodel habe ich den RxUI Befehl und die dialogcoordinator Instanz festgelegt.

public MainWindowViewModel(IDialogCoordinator dialogCoordinator) 
    { 

     _dialogCoordinator = dialogCoordinator; 

     ShowDialog = ReactiveCommand.CreateFromTask(async() => 
     { 
      await _dialogCoordinator.ShowMessageAsync(this, "Message from VM", "MVVM based dialogs!"); 
     }); 

     ShowDialog.ThrownExceptions.Subscribe(ex => Console.WriteLine(ex.ToString())); 

    } 

Egal, was ich versucht habe es immer die gleichen Fehler werfen, die

ist
System.InvalidOperationException: Context is not registered. Consider using DialogParticipation.Register in XAML to bind in the DataContext. 

Ich bin nicht sicher, ob es etwas nötig ist sonst den Dialog zu arbeiten oder wenn ich gerade bin mit die Befehle in RxUI falsch

+0

Funktioniert es mit warten DialogCoordinator.Instance.ShowMessageAsync (dies "Nachricht von VM", "MVVM-basierte Dialoge!"); ? – mm8

+0

@ mm8 Es gibt mir immer noch den gleichen Fehler. – TheAquam

+0

Wie stellen Sie dann den DataContext der Sicht ein? – mm8

Antwort

0

Ich hatte das gleiche Problem mit einem anderen MVVM-Framework (MVVM Light Toolkit). Aber der Rahmen scheint nicht das Problem zu sein. Es ist eine Frage des Timings. Der DialogCoordinator kann nicht vom Konstruktor aus aufgerufen werden. Ich persönlich alle den Code aus dem Konstruktor RelayCommand bewegt, die

<controls:MetroWindow 
x:Class="UI.MainWindow" 
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
xmlns:controls="clr-namespace:MahApps.Metro.Controls;assembly=MahApps.Metro" 
xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
xmlns:dialog="clr-namespace:MahApps.Metro.Controls.Dialogs;assembly=MahApps.Metro" 
xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity" 
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
dialog:DialogParticipation.Register="{Binding}" 
DataContext="{Binding Source={StaticResource Locator}, Path=Main}" 
d:DataContext="{d:DesignInstance vm:MainViewModel}" 
mc:Ignorable="d"> 
<i:Interaction.Triggers> 
    <i:EventTrigger EventName="ContentRendered"> 
     <i:InvokeCommandAction Command="{Binding StartupCommand}" /> 
    </i:EventTrigger> 
</i:Interaction.Triggers> 

Ich habe versucht, verschiedene Ereignisse wie Loaded abgefeuert wird, die in einigen Fällen gearbeitet, aber „ContentRendered“ immer in der VM habe ich den folgenden Code haben:

public ICommand StartupCommand 
    { 
     get 
     { 
      return new RelayCommand(async()=> 
      { 
       this.AccountName = await 
         dialogCoordinator.ShowInputAsync(this, "Welcome", "Please insert your account name");      
      }); 
     } 
    } 

Also im Grunde scheint es noch nicht direkt registriert zu sein, aber nachdem der Inhalt geladen ist es ist. (In diesem Beispiel habe ich ShowInputAsync verwendet, aber es sollte mit ShowMessageAsync funktionieren.)

Verwandte Themen