WPF属性网格,事件处理程序添加'ref'参数。

时间:2013-01-31 11:12:38

标签: c# .net wpf event-handling propertygrid

我遇到了Visual Studio 2010的WPF属性网格的一个非常奇怪的行为。我正在开发一个包含大量属性和事件处理程序的组件工具集。 ref 参数导致问题。

在我的一个对象中,我有PositionChanged事件处理程序, ref 参数定义如下:

public delegate void PositionChangedHandler(LineSeriesCursor sender, double newValue, **ref** bool cancelRendering); 

public event PositionChangedHandler PositionChanged = null;

当我创建LineSeriesCursor的实例并定义事件处理程序

LineSeriesCursor cursor = new LineSeriesCursor(); 
cursor.PositionChanged += [TAB][TAB]

它正确地创建了处理程序方法存根:

cursor.PositionChanged += new LineSeriesCursor.PositionChangedHandler(cursor_PositionChanged);
void cursor_PositionChanged(LineSeriesCursor sender, double newValue, **ref** bool cancelRendering)
{
           //this works and compiles then OK. 
}

但是,如果我在WPF属性网格中添加LineSeriesCursor,然后导航到XAML中的LineSeriesCursor标记,从属性网格添加PositionChanged事件处理程序,则创建方法存根参考,如下:

private void LineSeriesCursor_PositionChanged(LineSeriesCursor sender, double newValue, bool cancelRendering)
{
    //Does not compile, because of invalid method parameter list. **ref** is missing.
}

对我来说,这听起来像是Visual Studio 2010的错误。关于此事的任何类似经历或建议?

感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

为什么不遵循microsoft方式并从EventArgs

派生

例如

public class PositionChangedEventArgs : EventArgs
{
   public bool Cancel {get;set;}
   public int NewValue {get;set;}

} 

public event EventHandler<PositionChangedEventArgs> PositionChanged {get;set;}


protected virtual void OnPositionChanged(int newValue)
{
    if (this.PositionChanged !=null)
    {
        var args = new PositionChangedEventArgs(){NewValue = newValue};
        this.PositionChanged(this,args);
        if (args.Cancel)
        {
            //Do something to cancel..
        }
    }
}

然后

cursor.PositionChanged += (sender,e) =>
{
    e.Cancel = true;
    var x = e.NewValue;
};