WPF MVVM Nowe okno

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.

A6
  • Rejestracja:ponad 9 lat
  • Ostatnio:ponad 6 lat
  • Postów:20
0

AddNewSongCommand = new RelayCommand(AddNewwSong);
2)

Kopiuj
        private async void AddNewwSong()
        {
            await IoC.UI.ShowWindow(new WindowDialogViewModel
            {
                Title = "Add new..."
            }
            );
        }
Kopiuj
        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

mr-owl
  • Rejestracja:prawie 10 lat
  • Ostatnio:ponad rok
  • Postów:206
1

Witam,

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

Pozdrawiam,

mr-owl

grzesiek51114
grzesiek51114
  • Rejestracja:ponad 11 lat
  • Ostatnio:ponad 4 lata
  • Postów:2442
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:
Kopiuj
//	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:
Kopiuj
this.ShowAboutWindowEvent?.Invoke()
  1. Natomiast w code-behind obsługuję to zdarzenie np. wołając nowe okno za pomocją IoC:
Kopiuj
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.

edytowany 2x, ostatnio: grzesiek51114

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.