Laden...

DataContext in ViewModel A von ViewModel B aus ändern?

Erstellt von GCPS vor 3 Jahren Letzter Beitrag vor 3 Jahren 563 Views
G
GCPS Themenstarter:in
1 Beiträge seit 2020
vor 3 Jahren
DataContext in ViewModel A von ViewModel B aus ändern?

Hallo,

ich versuche mich gerade daran, meine erste Applikation im MVVM Design-Pattern zu entwickeln. Dabei besteht die MainWindow.xaml aus einem einzigen ContentControl, welches an die CurrentView des MainWindowViewModel.cs gebunden ist. Im Konstruktor erstelle ich dann eine Instanz des MainViewModels und setze diese als CurrentView, um so die MainView als Content für die ContentControl zu bekommen. Jetzt würde ich gerne aus der MainViewModel, die CurrentView in der MainWindowViewModel setzen, um so den Content für die ContentControl zu ändern. Jetzt ist es mir jedoch ein Rätsel, wie ich aus dem MainViewModel auf die CurrentView des MainWindowViewModel zugreifen kann.
Ich habe dazu mal den nachfolgenden Code angefügt, ich hoffe dies verdeutlicht es etwas.

MainWindow.xaml


    <Window.DataContext>
        <vm:MainWindowViewModel/>
    </Window.DataContext>
    <Grid>
        <ContentControl Content="{Binding CurrentView}"></ContentControl>
    </Grid>

App.xaml


            <DataTemplate DataType="{x:Type vm:MainViewModel}">
                <view:Main/>
            </DataTemplate>

MainWindowViewModel.cs


public class MainWindowViewModel : ObservableObject
    {
        public MainWindowViewModel()
        {
            MainVM = new MainViewModel(DialogCoordinator.Instance);
            CurrentView = MainVM;
        }

        private object _currentView;
        public object CurrentView
        {
            get { return _currentView; }
            set { OnPropertyChanged(ref _currentView, value); }
        }

        private MainViewModel _mainVM;
        public MainViewModel MainVM
        {
            get { return _mainVM; }
            set { OnPropertyChanged(ref _mainVM, value); }
        }

    }

5.658 Beiträge seit 2006
vor 3 Jahren

Normalerweise hätte man ein MainViewModel, welches dem MainWindow zugeordnet ist, und dann SubViewModels, welche innerhalb des MainWindows oder in weiteren Fenstern aufgerufen werden können.

Auch hier kann man Objektorientierte Programmierung nutzen, anstatt object:


public class MainViewModel : BaseViewModel
{
  public ObservableCollection<BaseSubViewModel> SubViewModels { /* ... */ }
  public BaseSubViewModel SelectedViewModel { /* ... */ }
}

public abstract class BaseSubViewModel : BaseViewModel
{
  // ...
}

public class HomeViewModel : BaseSubViewModel 
{
  // ...
}

public class SettingsViewModel : BaseSubViewModel 
{
  // ...
}

// etc.

Weeks of programming can save you hours of planning