Как передавать данные из MainViewModel в UserControlViewModel?

Есть главный экран, в нем по кнопке переключаются UserControl'ы.

По кнопке все прекрасно отображается, но в модели Simatic существует массив, который нужно отображать и передавать в CharViewModel, где по изменению значения Slider отображается на графике определенная часть массива.

В модели Simatic.TranslatedCoord данные могут измениться в любое время и нужно их передать в CharViewModel.

P.S. Была мысль передавать полностью экземпляр Simatic, но все его данные не нужны, а только координаты.

XAML MainView:

<! -- Кнопки переключения UserControl -->
<Button Content="График"    Command="{Binding CmdSelectChart}"   />
<Button Content="Модель"    Command="{Binding CmdSelectModel3D}" />
<Button Content="Фото"      Command="{Binding CmdSelectPhoto}"   />
<Button Content="Настройки" Command="{Binding CmdSelectSetting}" /> 

<ContentPresenter Content="{Binding SelectWindow}" />

MainViewModel.cs:

private AppSetting appsetting;
private Simatic simatic;
private object selectWindow;
private ObservableCollection<object> selectWindowList;

private CharUserControl charUserControl;
private Model3DUserControl model3UserControl;
private PhotoUserControl photoUserControl;
private SettingUserControl settingUserControl;

private ICommand cmdSelectChart, cmdSelectModel3D, cmdSelectPhoto, cmdSelectSetting;


// Поля класса
public Simatic Simatic
{
    get => simatic;
}

public object SelectWindow
{
    get => selectWindow;
    set
    {
        selectWindow = value;
        OnPropertyChanged("SelectWindow");
    }
}

// Команды
public ICommand CmdSelectChart
{
     get => cmdSelectChart;
}
// и т.д. для ICommand


public MainViewModel()
{

    appsetting = SettingReader();
    simatic = new Simatic(appsetting.Simatic);
    
    // ...
    
    charUserControl = new CharUserControl(appsetting.Measurement, simatic.TranslatedCoord);
    model3UserControl = new Model3DUserControl(appsetting.Measurement);
    photoUserControl = new PhotoUserControl(appsetting.Photo);
    settingUserControl = new SettingUserControl();
    
    selectWindowList = new ObservableCollection<object> 
    { 
       charUserControl, 
       model3UserControl, 
       photoUserControl, 
       settingUserControl 
    };

    // Инициализируем действия кнопок
    cmdSelectChart = new DelegateCommand((o) => SelectWindow = selectWindowList[0]);
    cmdSelectModel3D = new DelegateCommand((o) => SelectWindow = selectWindowList[1]);
    cmdSelectPhoto = new DelegateCommand((o) => SelectWindow = selectWindowList[2]);
    cmdSelectSetting = new DelegateCommand((o) => SelectWindow = selectWindowList[3]);

}

XAML CharUserControl:

<Slider Value="{Binding SliderValue, Mode=TwoWay}" SelectionStart="0" Minimum="0" Maximum="{Binding MaxSliderValue}" TickPlacement="BottomRight" TickFrequency="1" IsSnapToTickEnabled="True" IsSelectionRangeEnabled="True" />

<lvc:CartesianChart DockPanel.Dock="Top" DisableAnimations="True" LegendLocation="Top">
    <lvc:CartesianChart.Series>
            <lvc:LineSeries Values="{Binding ModelCharts, Mode=OneWay}" StrokeThickness="1.5" Stroke="Green" LineSmoothness="0" />
        </lvc:CartesianChart.Series>
</lvc:CartesianChart>

CharViewModel:

private MeasurementSetting setting;
private Charts charts;
private ChartValues<ObservablePoint> modelCharts;
private double[,] coordinates;
private int sliderValue;

public int SliderValue
{
    get => sliderValue;
        set
        {
            sliderValue = value;
            SliderValueUpdateData(sliderValue);
            OnPropertyChanged("SliderValue");
        }
}

public ChartValues<ObservablePoint> ModelCharts
{
    get => modelCharts;
        private set
        {
            modelCharts = value;
            OnPropertyChanged("ModelCharts");
        }
}

public double[,] Coordinates
{
    get => coordinates;
        set
        {
            coordinates = value;
            OnPropertyChanged("Coordinates");
        }
}

public CharViewModel(MeasurementSetting setting, double[,] coordinates)
{
    this.setting = setting;
    this.coordinates = coordinates;

    charts = new Charts(setting.PointCount, setting.PointDistance);
}

private void SliderValueUpdateData(int value)
{
    if (coordinates != null)
            ModelCharts = charts.Draw(value, coordinates);
    else
            ModelCharts = charts.EmptyPoints();
}

Ответы (1 шт):

Автор решения: Mikhail

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

Мой model:

 public class LabelData : ViewModelBase
    {
        private string? _title = String.Empty;
        public string? Title
        {
            get => _title;
            set => this.RaiseAndSetIfChanged(ref _title, value);
        }
     }

Мой VM:

public class MainWindowViewModel : ViewModelBase
{
    private LabelData _description;
    private ViewModelBase _currentPageViewModel;
    public ViewModelBase CurrentPageViewModel
    {
        get => _currentPageViewModel;
        set => this.RaiseAndSetIfChanged(ref _currentPageViewModel, value);
    }
    public MainWindowViewModel()
    {
        _description = new LabelData();
        CurrentPageViewModel = new LoginViewModel(this, _description);
    }
    public void NavigateBackToLogin()
    {
        TransitionDirection = true;
        CurrentPageViewModel = new LoginViewModel(this, _description);
    }
}

И VM странички логина:

public class LoginViewModel : ViewModelBase
{
    private MainWindowViewModel _mainWindowViewModel;
    private LabelData _labelData;
    public LoginViewModel(MainWindowViewModel mainWindowViewModel, LabelData labelData)
    {
        _mainWindowViewModel = mainWindowViewModel;
        _labelData = labelData;
        LoginCommand = ReactiveCommand.Create(ToLabelList);
    }
 }

И получить данные можно так string? Title => _labelData.Title;

→ Ссылка