2016-03-25 10 views
1

Ich verwende den folgenden Code auf die Schaltfläche klicken navigieren:Wie MouseOver-Ereignis in MVVM zu erstellen?

XAML:

<Button x:Name ="Btn_Import" Grid.Row="33" Grid.Column="15" Grid.ColumnSpan="36" Grid.RowSpan="36" Command="{Binding NavigateCommand}" CommandParameter="ViewImportProgress"/> 

Ansichtsmodell:

public DelegateCommand<string> NavigateCommand { get; set; } 

public MainButtonsViewModel(IRegionManager regionManager, IMainMenuTooltipViewer mainMenuTooltipViewer) 
     { 
      NavigateCommand = new DelegateCommand<string>(Navigate); 
     } 

private void Navigate(string uri) 
     { 
      regionManager.RequestNavigate("ScreenNavigationRegion", uri); 


     } 

und es funktioniert gut. Nun meine Frage ist, was würde Code gleichwertig sein, um Navigation MouseOver-Ereignis statt MouseClick-Ereignis, natürlich in MVVM-Muster und Verwendung von Prism arbeiten?

Antwort

6

Sie können interractions verwenden

declare namespace

xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity" 

als Sie Befehl Ereignis

<Button Content="Navigate" > 

    <i:Interaction.Triggers> 

     <i:EventTrigger EventName="MouseEnter"> 

      <i:InvokeCommandAction Command="{Binding NavigateCommand}" CommandParameter="ViewImportProgress"/> 

     </i:EventTrigger> 

    </i:Interaction.Triggers> 

</Button> 
+0

Wie implementieren Sie NavigateCommand? –

+1

Es ist nur ein Beispiel, wie Befehl an Ereignis gebunden wird. Anstelle von NavigationCommand können Sie einen beliebigen anderen Befehl verwenden. Implementierung von NavigationCommand abhängig von der Projektinfrastruktur. Zum Beispiel können Sie NavigationService mit der Methode "void Navigate (Type vm)" definieren, in Ihrem DI-Container registrieren und dann einfach im Befehl navigationService.Navigate (typeof (yourNewVM)); – Anton

2

binden kann ich persönlich lieber EventToCommand verwenden, weil der PassEventArgsToCommand Eigenschaft:

xmlns:cmd ="http://www.galasoft.ch/mvvmlight" 

<i:Interaction.Triggers> 
    <i:EventTrigger EventName="KeyDown"> 
     <cmd:EventToCommand Command="{Binding KeyDownCommand}" PassEventArgsToCommand="True" /> 
    </i:EventTrigger> 
</i:Interaction.Triggers> 

die Sie dann wie folgt verwenden:

public ICommand KeyDownCommand { get { return new RelayCommand<KeyEventArgs>(OnKeyDown); } } 
private void OnKeyDown(KeyEventArgs args) 
{ 
    if (args.Key == Key.Insert) 
     InsertSomething(); 
} 

es ist nicht ganz so wichtig, mit Maus-Nachrichten in der Praxis, weil ich die Parameter mit einem Proxy in der Regel ersetzen, die, neben anderen Dingen, meiner Meinung nach Modell erlaubt zu erhöhen Capture/Release-Ereignisse usw. Es ist jedoch praktisch für Dinge wie Tastenanschläge oder das Closing-Ereignis, wo Sie auf die Argumente und die Verwendung eines Proxy ist nur eine weitere unnötige Abstraktionsschicht hinzufügen müssen.

+2

Was ist der cmd-Namespace in diesem Beispiel? – markokstate

+0

@markokstate: Code aktualisiert. –