Как получить доступ к общедоступным переменным из другой модели представления - PullRequest
0 голосов
/ 28 июня 2019

У меня есть открытая переменная в одной модели представления, к которой я хочу получить доступ (получить и установить) из другого кода кода сзади.У меня есть MainWindowViewModel и SettingsViewModel.Кодовый код, к которому я хочу иметь доступ к этой переменной, уже имеет определение DataContext для MainWindowViewModel, что, я думаю, может быть проблемой, поскольку, насколько я знаю, я не могу определить два DataContext для одного и того же представления.

В качестве примера, SettingsViewModel имеет переменную с именем LowerLimit, которую я связал с выбранным значением NumericUpDown.Я инициализировал переменную для хранения DataContext как SettingsViewModel, чтобы я мог получить доступ к переменной в этом ViewModel.Я сделал это с кодом

var settingsContext = DataContext as SettingsViewModel;

Но по какой-то причине это выдает исключение NullRefereceException, говоря, что settingsContext имеет значение null.

SettingsViewModel.cs:

public double[] LowerLimit { get; set; } = { 0, 0, 0, 0 };  //LowerLimit NumericUpDown

MainWindow.xaml.cs:

public MainWindow()
{
   InitializeComponent();
   DataContext = new MainWindowViewModel();
}

private void Run_Clicked(object sender, RoutedEventArgs args) //Button click event
{
   ...
   var settingsContext = DataContext as SettingsViewModel;
   lowerLimitCol = (int)settingsContext.LowerLimit[generalIndex];
}

Я предоставил только соответствующий код проблемы.Если я ошибаюсь, и для ответа на вопрос требуется больше кода, я могу предоставить его.

Ожидаемый результат: settingsContext получает DataContext из SettingsViewModel, что позволяет мне получить доступ к переменной LowerLimit из MainWindow.xaml.cs и назначить ее.в локальную переменную.

Фактический результат: NullReferenceException, settingsContext был нулевым

1 Ответ

1 голос
/ 29 июня 2019

Вы инициализируете свой DataContext экземпляром MainWindowViewModel:

DataContext = new MainWindowViewModel();

И затем вы пытаетесь привести DataContext к SettingsViewModel:

var settingsContext = DataContext as SettingsViewModel;

Это, очевидно, не сработает, потому что вы устанавливаете DataContext для экземпляра MainWindowViewModel, а не SettingsViewModel.

Один из способов обойти это - выставить ваше SettingsViewModel как свойство MainWindowViewModel чтобы вы могли потом сделать:

var settingsContext = ((MainWindowViewModel)DataContext).Settings
...