如何从另一个视图模型访问公共变量

时间:2019-06-28 14:46:13

标签: datacontext avaloniaui

我在一个View模型中有一个公共变量,我希望能够从后面的另一个Views中访问(获取和设置)。我有一个MainWindowViewModel和一个SettingsViewModel。我想要能够访问此变量的代码后面已经有MainWindowViewModel的DataContext定义,我认为这可能是问题所在,因为据我所知,我无法为同一视图定义两个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从SettingsViewModel获取DataContext,允许我从MainWindow.xaml.cs访问LowerLimit变量并将其分配给本地变量。

实际结果:NullReferenceException,settingsContext为空

1 个答案:

答案 0 :(得分:1)

您正在将DataContext初始化为MainWindowViewModel的实例:

DataContext = new MainWindowViewModel();

然后您尝试将DataContext强制转换为SettingsViewModel

var settingsContext = DataContext as SettingsViewModel;

这显然不起作用,因为您将DataContext设置为MainWindowViewModel而不是SettingsViewModel的实例。

一种解决方法是将SettingsViewModel公开为MainWindowViewModel的属性,以便您可以这样做:

var settingsContext = ((MainWindowViewModel)DataContext).Settings
相关问题