2010-08-04 21 views
11

Pencerenin yüklü olduğunu bildirmek için bir komut tetiklemek mümkün mü? Ayrıca , senin View arkasındaki kodu önlemek için (anlamda Caliburn, ONXY, MVVM Araç Seti, vb çerçeveler)Wpf'de bir pencere yüklendiğinde Komut nasıl tetiklenir

+6

hemen hemen tüm olaylar ateş edemez: İşte

kullanımının çok basit bir örnektir ViewModel'de bir komut. Kodu kabul edip CodeBehind'e 1 satırlık bir kod yazabilir veya birkaç karmaşık kod satırının aynı şeyi yapmasından sonra bazı belirsiz desenleri uygulayabilirsiniz. #dontbeapurist –

+0

@EduardoMolteni ile katılmıyorum. Eğer etkinlik veri ile çalışmakla ilgiliyse, o zaman WPF'deki davranışları kullanarak kolay bir şekilde önlenebilen SM ile arka planda çalışmanız gerekecektir. – JoanComasFdz

cevap

18

herhangi MVVM çerçeveler kullanmıyorum , Microsoft'tan ücretsiz olarak indirebileceğiniz System.Windows.Interactivity dll (Expression Blend ile birlikte gelir) etkileşim kitaplığını kullanın.

Ardından, bir komutu yürüten bir davranış oluşturabilirsiniz. Bu şekilde Tetikleyici, Komutu çağıran Davranışı çağırır.

<ia:Interaction.Triggers> 
    <ia:EventTrigger EventName="Loaded"> 
     <custombehaviors:CommandAction Command="{Binding ShowMessage}" Parameter="I am loaded"/> 
    </ia:EventTrigger> 
</ia:Interaction.Triggers> 

CommandAction (ayrıca System.Windows.Interactivity kullanır) şöyle olabilir:

public class CommandAction : TriggerAction<UIElement> 
{ 
    public static DependencyProperty CommandProperty = DependencyProperty.Register("Command", typeof(ICommand), typeof(CommandAction), null); 
    public ICommand Command 
    { 
     get 
     { 
      return (ICommand)GetValue(CommandProperty); 
     } 
     set 
     { 
      SetValue(CommandProperty, value); 
     } 
    } 


    public static DependencyProperty ParameterProperty = DependencyProperty.Register("Parameter", typeof(object), typeof(CommandAction), null); 
    public object Parameter 
    { 
     get 
     { 
      return GetValue(ParameterProperty); 
     } 
     set 
     { 
      SetValue(ParameterProperty, value); 

     } 
    } 

    protected override void Invoke(object parameter) 
    { 
     Command.Execute(Parameter);    
    } 
} 
+0

Bu kodun Silverlight için olduğunu fark ettim. WPF'de eşdeğer tetikleyici/davranışlar bulabilirseniz, aynı prensiplerin işe yarayacağını düşünürdüm. – programatique

+1

CommandAction yerine, şimdi bunun için mevcut bir eylem var gibi görünüyor [InvokeCommandAction] (http://msdn.microsoft.com/en-us/library/system.windows.interactivity.invokecommandaction (Expression.40) .aspx) – Patrick

7
private void Window_Loaded(object sender, RoutedEventArgs e) 
    { 
     ApplicationCommands.New.Execute(null, targetElement); 
     // or this.CommandBindings[0].Command.Execute(null); 
    } 

ve xaml

Loaded="Window_Loaded" 
+2

MVVM kullanıyorum bahsetmeyi unuttum. Ne zaman, bir pencere yüklenir. ViewModel sınıfımda dinleyebileceğim bir komut vermeli. –

+22

MVVM bir din değildir. CodeBehind'e bir kod satırı ekleyebilir ve dünya hala dönecektir. –

+0

Emin misin? dönmeye devam edeceğinden emin misin? :) – GONeale

2

davranışları kullanan bir daha genel bir yol AttachedCommandBehavior V2 aka ACB de önerilmiştir ve hatta birden fazla olay için-komuta bağlamaları destekler

<Window x:Class="Example.YourWindow" 
     xmlns:local="clr-namespace:AttachedCommandBehavior;assembly=AttachedCommandBehavior" 
     local:CommandBehavior.Event="Loaded" 
     local:CommandBehavior.Command="{Binding DoSomethingWhenWindowIsLoaded}" 
     local:CommandBehavior.CommandParameter="Some information" 
/> 
İlgili konular