Как передавать данные из 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 шт):
У меня есть проект на авалонии, я создал модель данных и передавал эту модель при переходе на другую страничку
Мой 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;