2009-06-26 24 views
26

Czy można wywołać komendę za pośrednictwem zdarzenia w WPF?Wywoływanie komend WPF za pośrednictwem zdarzeń

Mam przycisk Zapisz, że po naciśnięciu wywołuje polecenie, to jest wciśnięty po zakończeniu edycji tekstowe, ale również przekazuje obiekt jako parametr polecenia

<Button Content="Save" Command="{Binding DataContext.SaveQueueTimeCommand, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ItemsControl}}}" CommandParameter="{Binding}" /> 

Co bym najlepiej jak to zrobić jest wywołać tę komendę i przekazać obiekt jako parametr, gdy pole tekstowe traci ostrość, zamiast nacisnąć przycisk, coś takiego:

<Button LostFocus="{Binding SaveQueueTimeCommand}" /> 

i nadal jakoś przekazać obiekt jako parametr. Czy istnieje sposób do współpracy to bez użycia kodu za jak używam wzorzec MVVM

Dzięki za poświęcony czas

Odpowiedz

2

Obawiam się, że nie sądzę, żeby to, co chcesz zrobić, to możliwe. Polecenia nie są delegatami, więc nie można napisać polecenia do zdarzenia. Myślę, że najlepszą opcją jest obsłużyć zdarzenie Button.LostFocus, a następnie ręcznie wykonać polecenie z obsługi.

Nie ma nic złego w umieszczaniu kodu w kodzie podczas korzystania z MVVM, najlepiej jest go zminimalizować i zachować kod tylko do przeglądania powiązanych zadań. Nazwałbym ten widok kodu związany, więc byłoby znaleźć, aby umieścić kod w kodzie.

+0

Tak to ma sens, dzięki za poświęcony czas :) –

+0

Ostatecznie inna odpowiedź wyraźnie pokazała, że ​​* jest * możliwe (choć nie tak naprawdę bezpośrednio). – SRKX

15

Możesz użyć dołączonych zachowań, aby to osiągnąć. Marlon Grech napisał bibliotekę Attached Command Behaviors, aby zaoszczędzić kłopotu. Sposób użycia wygląda następująco:

<Grid> 
    <local:CommandBehaviorCollection.Behaviors> 
     <local:BehaviorBinding Event="MouseRightButtonDown" Command="{Binding SomeCommand}" CommandParameter="A Command on MouseRightButtonDown"/> 
    </local:CommandBehaviorCollection.Behaviors> 
</Grid> 
56

Najprostszym sposobem na to jest użycie wyzwalacza interakcji.

<Grid xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"> 
    <i:Interaction.Triggers> 
     <i:EventTrigger EventName="SomeEvent"> 
      <i:InvokeCommandAction Command="{Binding Path=SomeCommand, Mode=OneWay}"/> 
     </i:EventTrigger> 
    </i:Interaction.Triggers> 
</Grid> 

Dodałem to dla dobra potomności.

+0

To jest niesamowite. Wielkie dzięki za informację. – Magus

+5

Należy zauważyć, że http://schemas.microsoft.com/expression/2010/interactivity znajduje się w pliku System.Windows.Interactivity.dll, który jest zawarty w zestawie SDK Blend. – PeterM

2
<Grid MouseRightButtonDown ="{eb:EventBinding Command=SomeCommand, CommandParameter=$e}"> 

</Grid> 

poleceń

{eb:EventBinding} (Simple naming pattern to find Command) 

{eb:EventBinding Command=CommandName} 

CommandParameter

$e (EventAgrs) 

$this or $this.Property 

string 

https://github.com/JonghoL/EventBindingMarkup

Powiązane problemy