2010-08-04 6 views
11

창을 알리는 명령을 시작할 수 있습니까? 또한 , 나는 당신의보기에 뒤에 코드를 방지하기 위해 (의미에서 Caliburn, ONXY, MVVM 툴킷 등, 프레임 워크)wpf에서 창을로드 할 때 명령을 실행하는 방법

+6

거의 모든 이벤트가 발생하지 수 : 여기

사용의 매우 기본적인 예이다 ViewModel의 명령. 사실을 받아들이고 CodeBehind에 1 줄의 코드를 작성하거나 여러 복잡한 코드 줄이 동일하게 수행하는 모호한 패턴을 구현할 수 있습니다. #dontbeapurist –

+0

@EduardoMolteni에 동의하지 않습니다. 이벤트가 데이터 작업과 관련된 경우에는 코드 숨김에서 VM을 사용해야합니다. 이는 WPF의 비헤이비어를 사용하면 쉽게 피할 수 있습니다. – JoanComasFdz

답변

18

어떤 MVVM 프레임 워크를 사용하지 않는 Interactivity 라이브러리 (Microsoft에서 무료로 다운로드 할 수있는 System.Windows.Interactivity dll - 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" 
/> 
관련 문제