创建IntegerUpDown ValueChanged事件时编译器错误

时间:2013-12-16 04:32:25

标签: c# wpf

我正在使用WPFExtendedToolkit

中的IntegerUpDown控件

但是,我无法将事件分配给我的函数,以便在更改值时它将调用我的函数。我对c#和wpf都很陌生,所以非常感谢帮助。我一直试图让它像一个类似的例子here中那样展示。

private IntegerUpDown m_argumentUpDown;

public IntArgumentOption(ArgumentOptionDescription argumentDesc) : base(argumentDesc)
{
    m_argumentUpDown = new IntegerUpDown
    {
        Watermark = argumentDesc.m_watermark,
        Increment = (int)argumentDesc.m_interval,
        Minimum = (int)argumentDesc.m_minimum,
        Maximum = (int)argumentDesc.m_maximum,
        FormatString = "G",
        SelectAllOnGotFocus = true,
        MinWidth = 50,
        FontSize = 10,
        Margin = new System.Windows.Thickness(5, 0, 0, 0),
    };

    // COMPILER ERROR:
    m_argumentUpDown.ValueChanged += new RoutedPropertyChangedEventHandler<int>(ArgumentChanged);
}

void ArgumentChanged(object sender, RoutedPropertyChangedEventArgs<int> e)
{

}

执行此操作会导致编译错误:

  

错误CS0029:无法隐式转换类型'System.Windows.RoutedPropertyChangedEventHandler&lt; int&gt;'到'System.Windows.RoutedPropertyChangedEventHandler&lt;对象&gt;'

2 个答案:

答案 0 :(得分:0)

以下是可行的,我测试过。但我不知道这是否被认为是解决方案或IntegerUpDown控件的创建者意味着它是以这种方式使用。

m_argumentUpDown.ValueChanged += new RoutedPropertyChangedEventHandler<object>(ArgumentChanged);
//or you can change above line to following for brevity. ReSharper always suggesting me to do this
//m_argumentUpDown.ValueChanged += ArgumentChanged;

void ArgumentChanged(object sender, RoutedPropertyChangedEventArgs<object> e)
{
    //you need to cast New and Old value to int since both are of type object now
    int newVal = (int)e.NewValue;
    int oldVal = (int)e.OldValue;
}

答案 1 :(得分:0)

在UpDownBase类(Xceed.wpfToolkit.dll)中,ValueChanged的方法签名是:

public event RoutedPropertyChangedEventHandler<object> ValueChanged;

因此,在您的代码中,您必须声明一个事件处理程序,其中泛型的类型为“ Object ”而不是 int 。由于类型不匹配,编译器无法从对象隐式转换为Int。 所以改变代码如下

m_argumentUpDown.ValueChanged += new RoutedPropertyChangedEventHandler<object>(ArgumentChanged);

    }

    void ArgumentChanged(object sender, RoutedPropertyChangedEventArgs<object> e)
    {
           //type caste e.newValue and e.OldValue 
    }