2010-08-04 6 views
11

Возможно ли запустить команду для уведомления о загрузке окна. Кроме того, я не использую никаких рамок MVVM (Каркасы в том смысле, Caliburn, ONXY, MVVM Toolkit и т.д.,)Как запустить команду при загрузке окна в wpf

+6

Почти все события не могут стрелять команда в ViewModel. Вы можете просто принять факт и написать 1 строку кода в CodeBehind или реализовать какой-то неясный шаблон, который после нескольких запутанных строк кода делает то же самое. #dontbeapurist –

+0

Я не согласен с @EduardoMolteni. Если событие связано с работой с данными, вам нужно будет работать с VM позади кода, что можно легко избежать с помощью поведения в WPF. – JoanComasFdz

ответ

18

Чтобы избежать кода позади на ваш взгляд , используйте библиотеку интерактивности (файл System.Windows.Interactivity, который вы можете скачать бесплатно от 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

+1

Вместо CommandAction теперь для этого существует действующее действие [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); 
    } 

и XAML

Loaded="Window_Loaded" 
+2

Я забыл упомянуть, что использую MVVM. Когда загружается окно. Он должен запустить команду, чтобы я смог прослушивать мой класс ViewModel. –

+22

MVVM - это не религия. Вы можете добавить строку кода в CodeBehind, и мир все равно будет вращаться. –

+0

Вы уверены? вы уверены, что он продолжит вращаться? :) – GONeale

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