即使没有处理对象,事件也为null

时间:2017-08-14 13:18:29

标签: c#

当我通过COMMAND调用ShowRevertInventorySignDialogView()时,事件抛出ObjectNullException。我认为Object不会被处理为CurrentViewModel属性。

Command调用的GetReport()ShowRevertInventorySignDialogView()函数绑定到按钮。我很确定首先调用GetReport()函数,以便在引发事件之前创建对象。

我在这里缺少什么?

class MainWindowViewModel : ViewModel{

    public ViewModel CurrentViewModel
    {
        get { return currentViewModel; }
        set { currentViewModel = value; NotifyPropertyChanged(); }
    }

    public void GetReport()
    {
        inventoryReportViewModel = new InventoryReportViewModel();
        inventoryReportViewModel.OnStatusChange += Event_OnStatusChange;
        CurrentViewModel = inventoryReportViewModel;          
    }
}

public class InventoryReportViewModel : InventoryBaseViewModel
{
    public event EventHandler<StatusChangeEventArgs> OnStatusChange;

    private void ShowRevertInventorySignDialogView()
    {
        OnStatusChange(this, new StatusChangeEventArgs("test",10));
        ....
        ....
    }
}

XAML;

<ContentControl Content="{Binding Path=CurrentViewModel}" Margin="20 10 20 0"></ContentControl>

2 个答案:

答案 0 :(得分:0)

在举起活动之前检查是否有任何订阅者:

private void ShowRevertInventorySignDialogView()
{
    if (OnStatusChange != null)
        OnStatusChange(this, new StatusChangeEventArgs("test", 10));

    //or simply: OnStatusChange?.Invoke(this, new StatusChangeEventArgs("test", 10));
}

然后你应该至少摆脱异常。

由于您还没有向我们展示调用GetReport()方法的方式和位置,或者任何其他细节,因此无法说明ShowRevertInventorySignDialogView方法时为什么没有订阅者被叫。

答案 1 :(得分:0)

我发现问题的出现是因为XAML中viewModel的显式定义。我删除下面的行,现在我可以将正确的对象作为viewModel。 (我在DataTemplate中定义了VM)

<UserControl.DataContext>
    <vm:InventoryReportViewModel />
</UserControl.DataContext>