我遗漏了一些明显的东西:)
我有一个类 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);
}
}
“并非所有代码路径都返回值”
怎么做??
答案 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来表示事件
对此的解决方法是确保您正在使用类的正确实例,即正确的对象。如果您希望它是同一个对象