Frage

Hallo ich ein Anfänger Problem haben. Ich habe Shell (sie wpf Fenster sind) und in dieser Schale ist Bildschirm (es ist eine Benutzersteuerung / View-Modell).

Ich mag öffnen neue Fenster aus View-Modell, nicht Benutzerkontrolle in der Schale zeigen.

So ich neue Fenster erstellen - 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>

Export ChatViewModel mit MEF.

 public interface IChatViewModel
    {

    }

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

    }

Im Hinblick Modell Ich habe diese Methode:

Mit SHOWSCREEN Klasse help me Mr.Marco Amendola. Es sieht gefällt das:

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

Mein Problem ist, wenn ich neue Fenster versuche, zeige es funktioniert nicht, es funktioniert nur, wenn ich neue Benutzersteuerung, die in Shell (Fenster).

würde Ich mag Verhalten etwas erreichen wie in skype. Sie haben ein Hauptfenster mit listbox, Sie doppelt auf Einzelteil geklickt und es zeigt neue Chat-Fenster.

Hauptfenster kann mit Eventaggregator auf Chat-Fenster veröffentlichen und auch Chat-Fenster auf dem Hauptfenster veröffentlichen. Das ist mein Ziel.

Ich weiß, dass ich nicht Klasse SHOWSCREEN auf zeigt neues Fenster verwenden können. Ich würde gerne wissen, was richtiger Weg ist, neue Fenster aus Sicht Modell und inject Ereignis-Aggregator erstellen zu diesem wetteifern Modell.

Jede Beratung? Vielen Dank für Ihre Hilfe und Zeit.

War es hilfreich?

Lösung

Have you looked at WindowManager.Show or WindowManager.ShowDialog? Rob has a sample at http://caliburnmicro.codeplex.com/wikipage?title=The%20Window%20Manager. You can inject this dependency into your view model as IWindowManager.

Andere Tipps

I'm using this. Maybe could save a question about "where's the code ?".

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

How to use:
Without constructor parameter:

Dialog.ShowDialog<TestTableViewModel>();

With constructor paramater:

Dialog.ShowDialog<TestTableViewModel>(dt);

Note that I'm not using MEF

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top