2009-12-10 16 views
5

Satırlar için bir datagrid çift tıklama işleyicisi ayarlamak için EventToCommand nasıl kullanılacağını anlamaya çalışıyorum. Komut, her satır için viewmodel'de yaşıyor. Sadece numaralı telefondan, deneyimimden çok uzaktayım, çünkü henüz etkileşimleri kullanmadım.MvvmLight EventToCommand ve WPFToolkit DataGrid çift tıklatın

Teşekkürler.

mvvmlight etiketi kullanmıştım, ancak henüz yeni etiketler oluşturmak için yeterince yüksek yetkiye sahip değilim.

+0

Sizin için mvvm-light etiketini ekledim. Laurent Bugnion'un MVVM Light araç takımı için kullanılacak resmi olan bu. – dthrasher

cevap

11

Komut, "RowViewModel" üzerinde değil "GridVieModel" üzerinde yaşıyorsa bu çözüm olur.

<Window...  
     ...xmlns:dg="clr-namespace:Microsoft.Windows.Controls;assembly=WPFToolkit" 
      xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity" 
      xmlns:GalaSoft_MvvmLight_Command="clr-namespace:GalaSoft.MvvmLight.Command;assembly=GalaSoft.MvvmLight.Extras"> 
     <dg:DataGrid x:Name="dg"> 
        <i:Interaction.Triggers> 
         <i:EventTrigger EventName="MouseDoubleClick"> 
          <GalaSoft_MvvmLight_Command:EventToCommand CommandParameter="{Binding SelectedItem, ElementName=dg}" Command="{Binding Path=SelectCommand, Mode=OneWay}"/> 
         </i:EventTrigger> 
        </i:Interaction.Triggers> 
      </dg:DataGrid> 
    </Window> 

Sen satır ayrıca kendi ViewModel sahip olduğundan bir rowview oluşturup rowview satır (konteyner) bir alt öğe mousedoubleclick olayını kullanabilirsiniz.

Yoksa bağlama emirlerinizi bir dönüştürücü oluşturmak: selectedItem (a RelayCommand Mülkü'yle ISelectCommandable gibi bir şey)

+0

Torn ... Uzun zamandır bunu denemek için fırsatım olmayacak, ama cevapsız bırakmak istemiyorum. Teoride doğru görünüyor, ama ben gerçekten komutun RowViewModel'de olduğu bir şey istedim. Veya belki de DataGrid'in ilgili satırı tanımlamayı destekleyen bir çift tıklama sağlamadığını ima ediyorsunuz? – Thomas

+0

Dönüştürücünün arkasındaki fikir, dönüştürücünün SelectedItem öğesini seçmesi ve Komutu döndürmesiydi. Bu şekilde RowViewModel komutunu çağırmış olsaydınız (ihtiyacım olsa bile gerçekten emin değilim ya da SelectedItem.SelectCommand gibi bir şey yapabilirseniz) Bir satırın çift tıklatılıp silinmediğini belirlemek için EventArgs'a ihtiyacınız olacaktır. Ama bunu mvvm-light toolkit ile yapabilirsiniz. – CodeWeasel

+0

K, örnek sözdizimi için teşekkürler. Bu yöntemi denemeye karar verirsem tekrar cevap vereceğim. – Thomas

4
komutu dönmek için gerekli türde ise

<GalaSoft_MvvmLight_Command:EventToCommand Command="{Binding SelectedItem, ElementName=dg, Mode=OneWay, Converter=...}"/> 

dönüştürücü sonra kontrol ederim durumda herkes yılında

burada görünümlü ve benim xaml içinde/EventToCommand

o
public class DataGridAttachedBehaviors 
{ 
    #region DoubleClick 

    public static DependencyProperty OnDoubleClickProperty = DependencyProperty.RegisterAttached(
     "OnDoubleClick", 
     typeof(ICommand), 
     typeof(DataGridAttachedBehaviors), 
     new UIPropertyMetadata(DataGridAttachedBehaviors.OnDoubleClick)); 

    public static void SetOnDoubleClick(DependencyObject target, ICommand value) 
    { 
     target.SetValue(DataGridAttachedBehaviors.OnDoubleClickProperty, value); 
    } 

    private static void OnDoubleClick(DependencyObject target, DependencyPropertyChangedEventArgs e) 
    { 
     var element = target as Control; 
     if (element == null) 
     { 
     throw new InvalidOperationException("This behavior can be attached to a Control item only."); 
     } 

     if ((e.NewValue != null) && (e.OldValue == null)) 
     { 
     element.MouseDoubleClick += MouseDoubleClick; 
     } 
     else if ((e.NewValue == null) && (e.OldValue != null)) 
     { 
     element.MouseDoubleClick -= MouseDoubleClick; 
     } 
    } 

    private static void MouseDoubleClick(object sender, MouseButtonEventArgs e) 
    { 
     UIElement element = (UIElement)sender; 
     ICommand command = (ICommand)element.GetValue(DataGridAttachedBehaviors.OnDoubleClickProperty); 
     command.Execute(null); 
    } 

    #endregion DoubleClick 

    #region SelectionChanged 
    //removed 
    #endregion 
} 

w tekrar yaptık nasıl merak ediyor gelir:

<dg:DataGrid.RowStyle> 
    <Style BasedOn="{StaticResource DataGridDemoRowStyle}"   
      TargetType="{x:Type dg:DataGridRow}"> 
     <Setter Property="skins:DataGridAttachedBehaviors.OnDoubleClick" 
       Value="{Binding Recall}" /> 
    </Style> 
</dg:DataGrid.RowStyle> 
+0

Sadece bunu gördüm ve ayrıntılara bakmak için çok fazla zaman harcamadan: gerçekten burada sadece bir EventToCommand Işığı uygulamıyor musunuz? – carlsb3rg

+0

Hatta bunu çağırabilir miyim bilmiyorum, çünkü bu çift tıklama için çok kesin, ama emin. – Thomas