Открыть новое окно из вида модели - PullRequest
2 голосов
/ 21 декабря 2010

Привет, у меня проблема новичка.У меня есть оболочка (это окно wpf), и в этой оболочке есть экран (это пользовательский элемент управления / модель представления).

Я хотел бы открыть новое окно из модели представления, а не отображать пользовательский элемент управления в оболочке.

Итак, я создаю новое окно - ChatView

<Window x:Class="Spirit.Views.ChatView"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
        xmlns:extToolkit="clr-namespace:Microsoft.Windows.Controls;assembly=WPFToolkit.Extended" Title="ChatView" Height="545" Width="763">
    <Grid Margin="4,4,4,4">
     </Grid>
</Window>

Экспорт ChatViewModel с MEF.

 public interface IChatViewModel
    {

    }

    [Export("ChatScreen",typeof(IChatViewModel))]
    public class ChatViewModel
    {

    }

В представлении моделиУ меня есть этот метод:

С классом ShowScreen мне поможет мистер Марко Амендола.Это выглядит примерно так:

public class ShowScreen : IResult
    {
        readonly Type _screenType;
        readonly string _name;

        [Import]
        public IShellViewModel Shell { get; set; }

        Action<object> _initializationAction = screen => { };

        public ShowScreen InitializeWith<T>(T argument) 
        {
            _initializationAction = screen =>
                                        {
                                            var initializable = screen as IInitializable<T>;
                                            if (initializable != null)
                                                initializable.Initialize(argument);
                                        };
        return this;
        } 

        public ShowScreen(string name)
        {
            _name = name;
        }

        public ShowScreen(Type screenType)
        {
            _screenType = screenType;
        }

        public void Execute(ActionExecutionContext context)
        {
            var screen = !string.IsNullOrEmpty(_name)
                ? IoC.Get<object>(_name)
                : IoC.GetInstance(_screenType, null);

            _initializationAction(screen);

            Shell.ActivateItem(screen);
            Completed(this, new ResultCompletionEventArgs());
        }

        public event EventHandler<ResultCompletionEventArgs> Completed = delegate { };

        public static ShowScreen Of<T>()
        {
            return new ShowScreen(typeof(T));
        }
    }

Моя проблема в том, что если я пытаюсь показать новое окно, оно не работает, оно работает, только если я показываю новый пользовательский элемент управления в оболочке (окне).

Я хотел бы добиться поведения что-то вроде в скайпе.У вас есть главное окно со списком, вы дважды щелкнули по элементу, и это показывает новое окно чата.

Главное окно может публиковать с EventAggregator в окне чата, а также окно чата может публиковать в главном окне.Это моя цель.

Я знаю, что не могу использовать класс ShowScreen при показе нового окна.Я хотел бы знать, как правильно создать новое окно из модели представления и внедрить агрегатор событий в эту модель.

Любой совет?Спасибо за вашу помощь и время.

Ответы [ 2 ]

6 голосов
/ 21 декабря 2010

Вы смотрели на WindowManager.Show или WindowManager.ShowDialog? У Роба есть образец на http://caliburnmicro.codeplex.com/wikipage?title=The%20Window%20Manager.. Вы можете добавить эту зависимость в модель представления как IWindowManager.

2 голосов
/ 09 июля 2012

Я использую это.Может быть, можно сохранить вопрос о "где код?".

DialogHelper:

public class DialogHelper
{
    public void ShowDialog<T>(params Object[] param) where T : class
    {
        var windowManager = new WindowManager();
        T viewModel = Activator.CreateInstance(typeof(T), param) as T;

        windowManager.ShowWindow(viewModel);
    } 
}

Как использовать:
Без параметра конструктора:

Dialog.ShowDialog<TestTableViewModel>();

С параметром конструктора:

Dialog.ShowDialog<TestTableViewModel>(dt);

Обратите внимание, что я не использую MEF

...