事件处理程序为空。

5
MainWindow构造函数中,我正在注册一个事件处理程序:
public partial class MainWindow : Window, INotifyPropertyChanged
{
    public MainWindow()
    {
        InitializeComponent();
        pageViewDocText = new PageViewDocText();
        framePageDocFieldDetail.Content = pageViewDocText;
        pageViewDocText.NewPageIRPRO += new GabeLib.SearchCls.DocEventHandler(ViewIPRO);
    }

    protected void ViewIPRO(string IRPOlink) // ...
}

public partial class PageViewDocText : Page, INotifyPropertyChanged
{
    public event GabeLib.SearchCls.DocEventHandler NewPageIRPRO;

    private void btn_PageBreakNext(object sender, RoutedEventArgs e)
    {
        // this fires but NewPageIRPRO is null
        if (NewPageIRPRO != null)
        {
            NewPageIRPRO("dummylink");
        }
    }
}

但在PageViewDocText中,NewPageIRPRO为空。

我做错了什么?
PageViewDocText中,我想调用MainWindow.ViewIPRO

这个事件处理程序会触发并注册以下代码行:pageViewDocText.NewPageIRPRO +=

App.StaticGabeLib.Search.NewDocIRPRO += new GabeLib.SearchCls.DocEventHandler(ViewIPRO);

3
PageViewDocText 构造函数是否触发了那个事件?这很容易调试;只需查看调用堆栈即可。除非您遗漏了有问题的代码,否则在订阅后该事件不可能为null。 - Ed S.
1
我认为您需要向我们展示代码的行数,其中 NewPageIRPRO 被设置为 null。 - Mathieu Guindon
@EdS。没有按钮事件处理程序触发该事件。我迷失了,为什么事件处理程序也是空的。在GabeLib(一个纯类)中,我使用事件处理程序似乎是同样的方式,它可以正常工作。 - paparazzo
1
@retailcoder 这是在按钮事件处理程序中。代码已发布。 - paparazzo
@Blam,请尝试为NewPageIRPRO事件实现添加/删除模式,并在内部设置断点以查看发生了什么。 - noseratio - open to work
在一个常用的方法中添加了一个检查,检查NewPageIRPRO是否存在。在某些调用中它存在,在某些调用中它不存在。该方法被一些事件处理程序使用。我怀疑在注册事件处理程序之前,NewPageIRPRO已经被分配了。仍在寻找解决方案。 - paparazzo
1个回答

1

看起来你在另一个类中调用了一个事件(未列出),并且缺少委托。

尝试使用以下代码:

public partial class MainWindow : Window, INotifyPropertyChanged
{
    public MainWindow()
    {
        InitializeComponent();
        pageViewDocText = new PageViewDocText();
        framePageDocFieldDetail.Content = pageViewDocText;
        pageViewDocText.PageBreakNext += new PageBreakNext(ViewIPRO);
    }

    protected void ViewIPRO(string IRPOlink) // ...
}

public partial class PageViewDocText : Page, INotifyPropertyChanged
{
    public delegate void PageBreakNext(string IRPOlink);
    public event PageBreakNext PageBreak;

    private void btn_PageBreakNext(object sender, RoutedEventArgs e)
    {
        // this fires but NewPageIRPRO is null
        if (PageBreak != null)
        {
            PageBreak("dummylink");
        }
    }
}

我不明白。btn_PageBreakNext是页面上一个按钮的事件处理程序,没有被任何页面或类调用。 - paparazzo
我创建了一个示例项目,其中包含另一个类中创建的事件委托,类似于您的代码,并且它似乎总是有效。因此,我认为您的代码是正确的。由于NewPageIRPRO为空,这表明它可能是PageViewDocText的不同实例,而不是MainWindow创建的相同实例。我建议将DocEventHandler委托放在PageViewDocText的构造函数中。例如:PageViewDocText(SearchCls.DocEventHandler NewPageIRPRO) { this.NewPageIRPRO = NewPageIRPRO; }。这应该防止任何实例在没有处理程序的情况下被创建。 - sharpguru
仍在处理中。我同意您的评论。似乎有两个PageViewDocText对象存在。将DocEventHandler放置在构造函数中可以解决这个问题,但我想找出为什么会有两个对象。 - paparazzo
那个框架源代码也被绑定在XAML中。我已经删除了XAML源代码,它消失了一段时间,但不知何故它并没有被固定下来。按钮事件在没有事件处理程序的XAML源代码上触发。在我付款之前让我验证一下。谢谢。奇怪的是构造函数没有触发两次。 - paparazzo
虽然不是直接的答案,但是引导我找到了答案。 - paparazzo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接