WPF MVVM Nowe okno

0

Jaki jest najlepszy sposób na otwieranie nowego okna stosując się do zasad MVVM w WPF?

Dodam, że ten sposób https://stackoverflow.com/questions/25845689/opening-new-window-in-mvvm-wpf nie działa, albo ja zle go stosuje.

A ten sposób https://stackoverflow.com/questions/21340531/what-is-the-recommended-way-to-open-a-new-window-using-mvvm-in-wpf tak średnio mi się podoba.

0

AddNewSongCommand = new RelayCommand(AddNewwSong);
2)

        private async void AddNewwSong()
        {
            await IoC.UI.ShowWindow(new WindowDialogViewModel
            {
                Title = "Add new..."
            }
            );
        }
        public Task ShowWindow(WindowDialogViewModel viewModel)
        {
            var task = new TaskCompletionSource<bool>();
            Application.Current.Dispatcher.Invoke(() =>
            {
                try
                {
                    NewSongsWindow newSongsWindow = new NewSongsWindow();
                    //tu robisz co chcesz ze swojim oknem
                    //.
                    //.
                    //.
                    newSongsWindow.Show();
                }
                finally
                {
                    task.TrySetResult(true);
                }
            });
            return task.Task;
        }
    }

zakładam ze rozumiesz IoC i ze wszystkie ViewModel masz w odrębnym rozwiązaniu

1

Witam,

Z mojej strony polecam https://github.com/FantasticFiasco/mvvm-dialogs

Pozdrawiam,

mr-owl

1

Hmm... nie wiem czy troszeczkę nie ma tutaj przerostu formy nad treścią.
Sam robię np. tak:

  1. Tworzę wewnątrz viewmodelu delegata wraz z eventem, który posłuży do otworzenia okna:
//	Dwie poniższe linijki można zastąpić oczywiście `Action` albo `Func`
//	w zależności do tego czy np. oczekujemy zwrócenia jakichś wartości etc...

public delegate void ShowAboutWindowEventHandler();
public event ShowAboutWindowEventHandler ShowAboutWindowEvent;
  1. Załóżmy, że mamy jakiś guzik zbindowany do komendy. Wewnątrz tejże komendy robię tak:
this.ShowAboutWindowEvent?.Invoke()
  1. Natomiast w code-behind obsługuję to zdarzenie np. wołając nowe okno za pomocją IoC:
public MainWindow(IUnityContainer unityContainer)
{
	InitializeComponent();

    var viewmodel = DataContext as MainWindowViewModel;
	viewmodel.ShowDictionariesWindowAction += () => unityContainer.Resolve<AboutWindow>().ShowDialog();
}

Do zdarzenia, o którym mowa może równie dobrze nie być niczego podpiętego i program się nie wywali. Ot viewmodel dostarcza event'a ale widok może go nawet nie obsłużyć tylko olać. Program się nie wywali.

1 użytkowników online, w tym zalogowanych: 0, gości: 1