2009-06-26 20 views
26

WPF'de bir olay aracılığıyla bir komutu çağırmak mümkün mü?WPF olayları kullanarak komutları çağırıyor

Ben kaydetme düğmesine basıldığında ne zaman bir metin kutusu düzenlemeyi bitirince, bu basıldığında bir komut çağırır, o da bir komut parametresi olarak bir nesneyi geçer gelmiş ben ideal yapmak istiyorum ne

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

bir şekilde bir parametre olarak nesneyi geçmesi

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

ve yine: doğrusu, böyle bir şey düğmesine basın olmasındansa bu komutu çağırır ve metin kutusu odağı kaybettiğinde parametre olarak nesneyi geçmesi edilir. orada MVVM desen kullanıyorum olarak geride kod kullanmadan bu modernleşmek için bir yol var mı zaman için

Teşekkür

cevap

2

Ben ne yapmak istiyorum mümkün olduğunu düşünmüyorum korkuyorum. Komutlar delegeler değildir, bu yüzden bir etkinliğe kadar bir komut yazamazsınız. Bence en iyi seçeneğiniz Button.LostFocus olayını işlemek ve daha sonra elle işleyiciden komutu yürütmektir.

MVVM kullanırken kodun arkasına kod koymakla ilgili bir sorun yok, yalnızca en aza indirgemek ve kodu yalnızca ilgili görevleri görüntüleyecek şekilde tutmak en iyisidir. Bu kod görünümünü ilgili olarak adlandırırdım, bu yüzden kodu arkadaki koda yerleştirmek olurdu.

+0

Evet bu, :) –

+0

Sonunda zaman için mantıklı sayesinde yapar diğer cevap açıkça * olduğunu gösterdi * (* gerçekte olmasa da). – SRKX

15

Bunu yapmak için ekli davranışları kullanabilirsiniz. Marlon Grech, size sorun kaydetmek için Attached Command Behaviors kütüphanesini yazdı. Kullanım şöyle:

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

Bunu yapmanın en kolay yolu bir etkileşim tetikleyicisi kullanmaktır.

<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> 

Bunu, aşk uğruna ekledim.

+0

Bu harika. Bilgi için çok teşekkürler. – Magus

+5

Not: http://schemas.microsoft.com/expression/2010/interactivity, Blend SDK'da bulunan System.Windows.Interactivity.dll dosyasındadır. – PeterM

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

</Grid> 

Komuta

{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