2012-09-25 29 views
6

Tengo un proyecto WPF en Windows 2012 en el que necesito cargar algo de información en el evento Window Loaded. Sin embargo, necesito hacer esto en el Modelo de Vista en lugar de en el CodeBehind. Estoy intentando utilizar el siguiente código:Window Loaded y WPF

En mi xaml:

<interactivity:Interaction.Behaviors> 
    <behaviors:WindowLoadedBehavior LoadedCommand="{Binding WindowLoadedCommand}" /> 
</interactivity:Interaction.Behaviors> 

en mi opinión Modelo:

private DelegateCommand _WindowLoadedCommand; 

public DelegateCommand WindowLoadedCommand 
{ 
    get 
    { 
     return _WindowLoadedCommand; 
    } 
    private set 
    { 
     _WindowLoadedCommand = value; 
    } 
} 

public ShellViewModel() 
{ 
    WindowLoadedCommand = new DelegateCommand(WindowLoadedAction); 
} 

protected void WindowLoadedAction() 
{ 
    ... 
} 

Mi comportamiento adjunto:

public class WindowLoadedBehavior : Behavior<FrameworkElement> 
{ 
    [SuppressMessage("Microsoft.StyleCop.CSharp.MaintainabilityRules", "SA1401:FieldsMustBePrivate", Justification = "Dependency Property. Allow public.")] 
    public static DependencyProperty LoadedCommandProperty = DependencyProperty.Register("LoadedCommand", typeof(ICommand), typeof(WindowLoadedBehavior), new PropertyMetadata(null)); 

    public ICommand LoadedCommand 
    { 
     get { return (ICommand)GetValue(LoadedCommandProperty); } 
     set { SetValue(LoadedCommandProperty, value); } 
    } 

    protected override void OnAttached() 
    { 
     base.OnAttached(); 

     AssociatedObject.Loaded += AssociatedObject_Loaded; 
    } 

    protected override void OnDetaching() 
    { 
     AssociatedObject.Loaded -= AssociatedObject_Loaded; 

     base.OnDetaching(); 
    } 

    private void AssociatedObject_Loaded(object sender, RoutedEventArgs e) 
    { 
     if (LoadedCommand != null) 
      LoadedCommand.Execute(null); 
    } 
} 

El OnAttached, AssociatedObject_Loaded y LoadedCommand get son todos disparando, pero el conjunto LoadedCommand no se está disparando y, obviamente, , el comando WindowLoaded no se activa. ¿Alguna pista de lo que puedo hacer para que esto funcione?

+1

¿Alguna razón en particular no está vinculando al comando directamente? –

+0

Según lo que he leído, enlazar el evento Window Loaded directamente no funciona por alguna razón. –

Respuesta

28

Hay algunas opciones. Un par de ellos figuran en esta lista:

how to call a window's Loaded event in WPF MVVM?

Sin embargo, en la remota posibilidad de que usted o cualquier otra persona le importa que usted está pasando varias horas para completar una tarea que debería haber tomado 30 segundos, es posible que desee probar esto en cambio

public MainWindow() 
{ 
    InitializeComponent(); 

    this.Loaded += new RoutedEventHandler(MainWindow_Loaded); 
} 

void MainWindow_Loaded(object sender, RoutedEventArgs e) 
{ 
    ShellViewModel.Instance.WindowLoadedCommand.Execute(null); 
} 
+2

¡Eso fue perfecto! Aparentemente, el problema con el que me topé es que las clases de manejo de eventos no se cargaron correctamente antes de que se cargara la ventana. Su método (junto con ser breve y directo) evitó eso y le permitió disparar correctamente. –