2010-08-04 59 views
11

是否可以觸發命令來通知窗口已加載。 另外,我沒有使用任何MVVM框架(框架在這個意義上,卡利,縞瑪瑙,MVVM工具包等)如何在wpf中加載窗口時觸發命令

+6

幾乎所有事件可能不火ViewModel中的命令。你可以接受這個事實,並在CodeBehind中寫入1行代碼,或者實現一些模糊的模式,在幾行復雜的代碼行之後執行相同的操作。 #dontbeapurist – 2010-08-04 18:24:08

+0

我不同意@EduardoMolteni。如果事件與數據工作相關,那麼您需要在後面的代碼中使用虛擬機,這可以通過WPF中的行爲輕鬆避免。 – JoanComasFdz 2012-12-12 12:44:12

回答

18

爲了避免後面的代碼在你的瀏覽,請使用Interactivity庫(System.Windows.Interactivity dll,您可以從Microsoft免費下載 - 也附帶Expression Blend)。

然後,您可以創建一個執行命令的行爲。這樣觸發器調用調用命令的行爲。

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

的commandAction(也使用System.Windows.Interactivity)可以看起來像:

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

我剛剛意識到這個代碼是針對Silverlight的。如果你可以在WPF中找到等價的觸發器/行爲,我會認爲同樣的主體應該可以工作。 – programatique 2010-08-04 21:16:54

+1

而不是CommandAction,現在似乎有一個現有的操作,[InvokeCommandAction](http://msdn.microsoft.com/en-us/library/system.windows.interactivity.invokecommandaction(Expression.40).aspx ) – Patrick 2012-05-02 15:59:08

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

和XAML

Loaded="Window_Loaded" 
+2

我忘了提及我正在使用MVVM。何時加載窗口。它應該激發一個命令,我可以在我的ViewModel類中偵聽。 – 2010-08-04 17:47:59

+22

MVVM不是一種宗教。你可以在CodeBehind中添加一行代碼,這個世界仍然在旋轉。 – 2010-08-04 18:28:13

+0

你確定!你確定它會繼續旋轉嗎? :) – GONeale 2012-06-12 05:38:09

2

使用行爲一個更通用的方法,提出了在AttachedCommandBehavior V2 aka ACB它甚至還支持多種事件到命令綁定,

下面是使用一個非常簡單的例子:

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