2009-07-17 4 views
0

Wenn ich versuche, ein Ereignis in meinem Kunden Modul zu veröffentlichen, funktioniert es nicht (die Teilnehmer nicht das Objekt erhalten, zeigt nichts):Wie veröffentliche ich ein Ereignis im Konstruktor meines Moduls?

public class CustomersRegister : IModule 
    { 
     private static IRegionManager regionManager; 
     private static IRegion region; 
     private static CustomersMainView view; 
     private static CustomerAllView allview; 
     private static CustomerEdit editView; 

     public CustomersRegister(IRegionManager manager) 
     { 
      regionManager = manager; 
     } 

     public void Initialize() 
     { 
      StackPanel sp = LoadNavigation(); 
      sp.PublishEvent(PublishEventNames.AddCustomerMenu); 
     } 

     public static StackPanel LoadNavigation() 
     { 
      StackPanel sp = new StackPanel(); 
      sp.Margin = new Thickness { Left = 10.0, Top = 5.0, Right = 10.0 }; 
      sp.Children.Add(new CustomerMainMenu()); 
      return sp; 
     } 

Allerdings, wenn ich diese Arbeit um, so dass ich laden sie einen Blick in die Region, die einen Befehl in dem Viewmodel aufruft, die das Ereignis veröffentlicht, und dann deaktiv ich die Ansicht, dann funktioniert es:

public class CustomersRegister : IModule 
{ 
    private static IRegionManager regionManager; 
    private static IRegion region; 
    private static CustomersMainView view; 
    private static CustomerAllView allview; 
    private static CustomerEdit editView; 

    public CustomersRegister(IRegionManager manager) 
    { 
     regionManager = manager; 
    } 

    public void Initialize() 
    { 
     region = regionManager.Regions[RegionNames.DockManagerContainer]; 
     view = new CustomersMainView(); 
     view.DataContext = new ViewModels.CustomersMainViewModel(); 
     region.Add(view); 
     region.Activate(view); 
    } 

Ausblick:

<UserControl x:Class="CustomersModul.Views.CustomersMainView" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:ncal="http://infragistics.com/ncal" 
    xmlns:Commands="clr-namespace:CRMInfrastructure.Commands;assembly=CRMInfrastructure" 
    ncal:XamDockManagerSettings.IsContentPaneInDocumentHost="True"    
    Commands:AvarioCommandBehavior.TheCommandToRun="{Binding LoadNavigation}" 
    Commands:AvarioCommandBehavior.RoutedEventName="Loaded" 
    Commands:AvarioCommandBehavior.CommandParameter="loading"> 
... 

Ansichtsmodell:

using System.Windows.Input; 
using CRMInfrastructure; 
using CRMInfrastructure.Commands; 
using CRMInfrastructure.Helpers; 

namespace CustomersModul.ViewModels 
{ 
    public class CustomersMainViewModel : ViewModelBase 
    { 
    public ICommand LoadNavigation { get; set; } 

    public CustomersMainViewModel() 
    { 
     LoadNavigation = new DelegateCommand<object>(load); 
    } 

    void load(object o) 
    { 
     CustomersNavigation.LoadNavigation().PublishEvent(PublishEventNames.AddCustomerMenu); 
     CustomersRegister.DeactivateView(); 
    } 
    } 
} 

Wie kann ich die Veranstaltung im Konstruktor des Moduls einfach veröffentlichen, anstatt diese ungeradee Abhilfe zu tun?

Antwort

0

Es sieht für mich so aus, als ob Ihre StackPanel-Variable den Gültigkeitsbereich verlässt, bevor das Ereignis propagiert wurde. Das würde erklären, warum das Verhalten anders ist, wenn Sie Ihr ViewModel in die Region geladen haben und einen statischen Aufruf der Veröffentlichungsmethode verwenden.

Versuchen Sie, eine Instanzvariable auf Klassenebene für das StackPanel in Ihrer IModule-Klasse zu erstellen.

Verwandte Themen