首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将事件级联到新创建的对象?

如何将事件级联到新创建的对象?
EN

Stack Overflow用户
提问于 2014-09-14 19:30:37
回答 2查看 595关注 0票数 1

我遗漏了一些显而易见的东西:)

我有一个类,这个,创建另一个类svm的对象。当创建者收到保存的事件时,我希望在所创建的对象中触发OnSaved方法。(我希望这是明确的)。

但此对象中保存的事件始终为空。svm.OnSaved的方法从未添加到它中。

代码语言:javascript
复制
            foreach (var rx in rxs)
            {
                StringByColumnViewModel svm = new StringByColumnViewModel();

                this.Saved +=  svm.OnSaved;
            }

this.Saved是:

代码语言:javascript
复制
    public event EventHandler Saved;       
    protected virtual void OnSaved()
    {
        if (Saved != null)
        {
            Saved(this, EventArgs.Empty);
        }
    }

svm.OnSaved是:

代码语言:javascript
复制
public class StringByColumnViewModel 
{
    public EventHandler OnSaved;

    public StringByColumnViewModel() 
    {
        this.OnSaved = (s, e) => { Console.WriteLine("Here I am"); };
    }

任何帮助都是非常感谢的。

增编:在父类中,保存的事件被触发为:

代码语言:javascript
复制
    private DelegateCommand save;
    public DelegateCommand Save
    {
        get
        {
            if (save == null)
            {
                save = new DelegateCommand(
                    () => this.doSave()
                    );
            }
            return save;
        }
    }
    private object doSave()
    {
        OnSaved();    <--THE SAVED EVENT IS NULL???
        return null;
    }

增编2:相信问题是一流的没有达到“创建者”类,这是怎么做到的?

顶级类的视图模型如下:

代码语言:javascript
复制
        ViewModelBase CurrentViewModel = new MyNewViewModel();

这是失败的:

代码语言:javascript
复制
        this.Saved += CurrentViewModel.OnSaved();

当ViewModelBase有:

代码语言:javascript
复制
        public event EventHandler Saved;
        public EventHandler OnSaved()    
        {
            if (Saved != null)
            {
                Saved(this, EventArgs.Empty);
            }
        }

使用“并非所有代码路径都返回值”

该怎么办??

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-09-14 20:25:37

你确定你真的打电话给

代码语言:javascript
复制
        foreach (var rx in rxs)
        {
            StringByColumnViewModel svm = new StringByColumnViewModel();

            this.Saved +=  svm.OnSaved;
        }

在活动发起之前订阅?在那之后你不取消订阅吗?可能您在派生类中使用相同的名称声明了事件,这会隐藏基类中的事件。你能张贴更多你的代码吗?

下面是一个简单的工作示例,其中创建者调用svm.OnSaved

代码语言:javascript
复制
class Program
{
    static void Main(string[] args)
    {
        var th = new This();
        th.OnSaved(); //creator receives a saved event
    }
}

public class This
{
    public event EventHandler Saved;
    public virtual void OnSaved()//made public in that example
    {
        if (Saved != null)
        {
            Saved(this, EventArgs.Empty);
        }
    }

    public This()
    {
        var rxs = new List<int> { 1, 2, 3 };
        foreach (var rx in rxs)
        {
            var svm = new StringByColumnViewModel();

            this.Saved += svm.OnSaved;
        }
    }
}

public class StringByColumnViewModel
{
    public EventHandler OnSaved;

    public StringByColumnViewModel()
    {
        this.OnSaved = (s, e) => { Console.WriteLine("Here I am"); };
    }
}

尝试不使用委托而不是事件,将StringByColumnViewModel更改为

代码语言:javascript
复制
public class StringByColumnViewModel
{
    public event EventHandler OnSaved;

    public StringByColumnViewModel()
    {
        this.OnSaved = (s, e) => { Console.WriteLine("Here I am"); };
    }

    public void RaiseSave(object sender, EventArgs e)
    {
        var handler = OnSaved;
        if (handler!= null)
        {
            handler(this, new EventArgs());
        }
    }
}

代码语言:javascript
复制
 this.Saved += svm.RaiseSave;
票数 1
EN

Stack Overflow用户

发布于 2014-09-14 20:32:39

帮助您找到错误的重要信息似乎缺少了,但是基于以下事实:

  • 您分配了一个事件处理程序(并且已经验证了)
  • 事件处理程序在调用OnSaved的对象上为空。
  • 你在课文里说这是一门课

可能是您混淆了类和对象。事件处理程序被分配给一个特定的对象,并且只有这一个对象,并且您可能在另一个对象上调用OnSaved,该对象没有一个事件处理程序。

解决这个问题的方法是确保您使用的是正确的类实例,即正确的对象。如果你希望它是同一个对象

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25837181

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档