2012-09-25 8 views
6

ben Pencere Yüklendi durumlarında bazı bilgilerini yüklemek için gereken Windows 2012'de bir WPF projesi var. Bunu CodeBehind'den ziyade View Modelinde yapmam gerekiyor. Benim xaml içindePencere Yüklendi ve WPF

: Ben şu kodu kullanın çalışılıyor benim Görünüm Modeli

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

:

private DelegateCommand _WindowLoadedCommand; 

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

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

protected void WindowLoadedAction() 
{ 
    ... 
} 

Benim ekli davranışı:

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); 
    } 
} 

OnAttached, AssociatedObject_Loaded ve LoadedCommand olsun hepsi ateş ediyor, ancak LoadedCommand seti ateş etmiyor ve belli ki WindowLoadedCommand ateş etmiyor. Çalışmak için ne yapabilirim?

+1

doğrudan komuta bağlayıcı değildir özel bir neden var? –

+0

Okuduğumdan, Window Loaded olayını doğrudan bağlamak bazı nedenlerle çalışmıyor. –

cevap

28

Birkaç seçenek vardır. Bunlardan bir çift burada listelenen:

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

Ancak, sizin veya bir başkasının size 30 saniye almış bir görevi tamamlamak için birkaç saat geçirdikten olduğunu umurunda, denemek isteyebilirsiniz off şansı bunun yerine.

public MainWindow() 
{ 
    InitializeComponent(); 

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

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

Bu mükemmeldi! Görünüşe göre, karşılaştığım problem, pencere yüklendikten önce olay işleme sınıflarının düzgün yüklenmemiş olmasıdır. Yönteminiz (kısa ve nokta ile birlikte) bundan kaçındı ve doğru şekilde ateşlenmesine izin verdi. –