2011-01-24 22 views
8

Ben bu soruya çok okumak vb MVVM desen, RelayCommand, ile bir WPF uygulama geliştiriyorum Bağlama ama ben kadar net değilim:WPF ve MVVM. Olaylar

Bir şekli taşımak yapmak istediğim, Örneğin bir elips gibi ve veritabanına koymak için son konumunu yakalayın.

Ancak, olaylara (MouseLetButtonDown, MouseLeftButtonUp ve MouseMove) komutları bağlayamıyorum. Ekli davranışları okudum, ancak konumu almak için olayların (MouseButtonEventArgs ve MouseEventArgs) argümanlarına ihtiyacım var.

Çözüm?

Bu WPF üzerinde çalışması gerekir böylece Silverlight için çalışıyor

cevap

2

<i:Interaction.Triggers> 
<i:EventTrigger EventName="MouseLeftButtonDown"> 
<cmd:EventToCommand Command="{Binding MouseCommand, PassEventArgsToCommand="True", CommandParameter="{Binding}"/> 
</i:EventTrigger> 
</i:Interaction.Triggers> 
+1

Bu kullanımın Blend – TigOldBitties

8

bir MVVM grafiksel uygulama yazma, ihtiyacınız tüm olayları göndermek için denemek için cazip (veya küçük değişiklikler yapılarak gerektiği en azından) modele göre. Ancak, görüntüye özgü fare olayının bir komutta işlenmesi, MVVM ilkelerine ve gevşek birleştirme hedefine aykırıdır.

Bu sorunu çözmenin yolu, işlemi görüntünün gerçekleştirebileceği bir göreve soyutlamak ve daha sonra sonuçlarını operasyonlar ve veriler aracılığıyla görüntüleme modeline geri iletmektir. Bunu desteklemek için kod arkasında küçük bir miktar kod yapmak istiyorsanız, MVVM polisi gelip çocuğunuzu almayacaktır. Fakat daha iyi bir yol, davranışlarla etkileşim kurmaktır. Davranışlar, MVVM deseni ve XAML'ınıza olay işleyicileri eklemeyi gerektirecek etkileşime ihtiyaç duyan uygulamalar ile iyi çalışan bir kod arkası olmadan yeniden kullanılabilir işlevsellik parçalarıdır. , Görüntüleme modeli can görünümü tarafından gerçekleştirilen sizin etkileşim ile

:

grafik nesneleri sürükleyerek için fare olayları kullanan bir davranış tam bir örneğin burada cevabımı bakın veri ve komutlara yapışmak.

+0

'u kullandığından bahsetmeyi unuttun Çok teşekkür ederim, ihtiyacım olan şey buydu. Şimdi, model MVVM'yi daha iyi anlıyorum. –

0

Bu WPF UIElement miras alınan her UI öğeleri için MouseMove MouseLeftButtonDown gibi herhangi olayların Komutanlığı ve CommandParameter bağlamak için izin verir, burada XCommand açık kaynak codeplex wpf uzantısı projesi, xcommand.codeplex.com bulabilirsiniz.

Sınıf kütüphanelerinin Windows 8 uygulama ve windows masaüstü uygulama sürümünü buradan bulabilirsiniz. WPF masaüstü uygulaması ile ilgilenen WPFXCommand istiyorsunuz. İşte, nasıl çalışıyor. İstek projenize referans olarak WPFXCommand.dll ekleyin.Herhangi UI öğeleri üzerinde herhangi müsait olaylara WPF UIElement itibaren devralan Şimdi

xmlns:XCmd="clr-namespace:WPFXCommand;assembly=WPFXCommand" 

, sen Komuta ve CommandParameter bağlayabilir:

olarak aşağıya xaml dosyasına ad ekleyin aşağısı:

<Grid> 
     <TextBlock Margin="20,30,20,0" VerticalAlignment="Top" Height="80" x:Name="XTextBlock" 
       Foreground="{Binding FgColor, Mode=TwoWay}" 
       XCmd:MouseMove.Command="{Binding TextBlockPointerMovedCommand}" 
       XCmd:MouseLeftButtonDown.Command="{Binding TextBlockPointerPressedCommand}" 
       XCmd:MouseLeave.Command="{Binding TextBlockPointerExitedCommand}"  
       Text="{Binding Description, Mode=TwoWay}"> 
     </TextBlock> 
     <Grid Grid.Column="1" Background="{Binding BgColor, Mode=TwoWay}" 
       XCmd:MouseMove.Command="{Binding GridPointerMovedCommand}" 
       XCmd:MouseMove.CommandParameter="{Binding ElementName=XTextBlock, Path=Text}" 
       XCmd:MouseLeftButtonDown.Command="{Binding GridPointerPressedCommand}" 
       XCmd:MouseLeftButtonDown.CommandParameter="{Binding ElementName=XTextBlock, Path=Text}" 
       > 
     </Grid> 
    </Grid> 

Bu durum, e arkasındaki havalandırma tabanlı kod.