0

我在一个视图模型中有一个公共变量,我希望能够从另一个视图代码隐藏中访问(获取和设置)。我有一个 MainWindowViewModel 和一个 SettingsViewModel。我希望能够访问此变量的代码隐藏已经具有 MainWindowViewModel 的 DataContext 定义,我认为这可能是问题所在,因为据我所知,我无法为同一个视图定义两个 DataContext。

例如,SettingsViewModel 有一个名为 LowerLimit 的变量,我已将其绑定到 NumericUpDown 的选定值。我初始化了一个变量以将 DataContext 保存为 SettingsViewModel,以便我可以访问该 ViewModel 中的变量。我用代码做到了这一点

var settingsContext = DataContext as SettingsViewModel;

但由于某种原因,这会抛出一个 NullRefereceException,说 settingsContext 是空的。

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 为 null

4

1 回答 1

2

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

DataContext = new MainWindowViewModel();

然后你试图投射DataContextSettingsViewModel

var settingsContext = DataContext as SettingsViewModel;

这显然行不通,因为您设置DataContextMainWindowViewModeland not的实例SettingsViewModel

解决此问题的一种方法是将您SettingsViewModel的属性公开,MainWindowViewModel以便您可以执行以下操作:

var settingsContext = ((MainWindowViewModel)DataContext).Settings
于 2019-06-29T12:59:49.293 回答