Как опубликовать событие в конструкторе моего модуля? - PullRequest
0 голосов
/ 17 июля 2009

Когда я пытаюсь опубликовать событие в моем модуле клиента, оно не работает (подписчик не получает объект, ничего не отображает):

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

Однако, если я делаю эту работу, чтобы загрузить вид в область, которая вызывает команду в модели представления, которая публикует событие, а затем я деактивировал вид, то он работает:

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

Вид:

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

ViewModel:

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

Как я могу просто опубликовать событие в конструкторе модуля вместо этого странного обходного пути?

1 Ответ

0 голосов
/ 17 июля 2009

Мне кажется, что ваша переменная StackPanel выходит из области видимости до того, как событие будет распространено. Это объясняет, почему поведение меняется после загрузки вашей ViewModel в регион и использования статического вызова метода публикации.

Попробуйте создать переменную экземпляра уровня класса для StackPanel в вашем классе IModule.

...