我正在使用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;'
答案 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
}