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

时间:2014-09-14 19:30:38

标签: c# wpf events

我遗漏了一些明显的东西:)

我有一个类 this ,它创建另一个类的对象 svm 。我希望在创建者收到已保存的事件时触发创建的对象中的OnSaved方法。 (我希望这很清楚)。

但此对象中的Saved事件始终为null。 svm.OnSaved的方法永远不会添加到它。

            foreach (var rx in rxs)
            {
                StringByColumnViewModel svm = new StringByColumnViewModel();

                this.Saved +=  svm.OnSaved;
            }

this.Saved是:

    public event EventHandler Saved;       
    protected virtual void OnSaved()
    {
        if (Saved != null)
        {
            Saved(this, EventArgs.Empty);
        }
    }

和svm.OnSaved是:

public class StringByColumnViewModel 
{
    public EventHandler OnSaved;

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

感谢任何帮助。

附录:在父类中,Saved事件被触发为:

    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:相信问题在于顶级人士没有达到“创造者”级别,这是怎么做到的?

顶级类的视图模型:

        ViewModelBase CurrentViewModel = new MyNewViewModel();

这失败了:

        this.Saved += CurrentViewModel.OnSaved();

当ViewModelBase具有:

        public event EventHandler Saved;
        public EventHandler OnSaved()    
        {
            if (Saved != null)
            {
                Saved(this, EventArgs.Empty);
            }
        }

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

怎么做??

2 个答案:

答案 0 :(得分:1)

你确定你实际打电话

        foreach (var rx in rxs)
        {
            StringByColumnViewModel svm = new StringByColumnViewModel();

            this.Saved +=  svm.OnSaved;
        }

在举办活动之前订阅?那之后你还没有取消订阅活动?也许您在派生类中声明了具有相同名称的事件,这会在基类中隐藏事件。你能发布更多的代码吗?

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

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更改为

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());
        }
    }
}

 this.Saved += svm.RaiseSave;

答案 1 :(得分:1)

似乎缺少帮助您找到错误的重要信息,但基于

这一事实
  • 您指定一个事件处理程序(并已验证)
  • 事件处理程序在您调用OnSaved
  • 的对象上为null
  • 您在文本中称​​此一个类

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

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