我在 WPF 项目中使用 .net 4.5。我想提出一个 TextBox TextChangedEvent。这就是我所做的:
tb.RaiseEvent(new RoutedEventArgs(TextBox.TextChangedEvent));
我之前在 Button.ClickEvent 上做过同样的 RaiseEvent,我该怎么做呢?
这会产生如下错误:
异常:抛出:“'System.Windows.RoutedEventArgs' 类型的对象无法转换为 'System.Windows.Controls.TextChangedEventArgs' 类型。” (System.ArgumentException) 引发 System.ArgumentException:“'System.Windows.RoutedEventArgs' 类型的对象无法转换为 'System.Windows.Controls.TextChangedEventArgs' 类型。”
[编辑]
实际更改的文本框文本由附加行为处理,如下所示。我想以编程方式引发事件的地方是另一个控件的附加行为。在后面的行为中,我确实有文本框对象。
public class textboxTextChangedBehavior : Behavior<TextBox>
{
protected override void OnAttached()
{
base.OnAttached();
AssociatedObject.TextChanged += OnTextChanged;
}
protected override void OnDetaching()
{
AssociatedObject.TextChanged -= OnTextChanged;
base.OnDetaching();
}
private void OnTextChanged(object sender, TextChangedEventArgs args)
{
var textBox = (sender as TextBox);
if (textBox != null)
{
//Populate ObservableCollection
}
}
}
我尝试提出事件的地方:
public class FindPopupBehavior : Behavior<Popup>
{
protected override void OnAttached()
{
AssociatedObject.Opened += _OpenFindPopup;
}
protected override void OnDetaching()
{
AssociatedObject.Opened -= _OpenFindPopup;
}
void _OpenFindPopup(object sender, EventArgs e)
{
//Fake a TextBox text changed event
if (TextBoxObject == null)
return;
TextBox tb = TextBoxObject as TextBox;
if (tb.Text == "")
return;
tb.RaiseEvent(new RoutedEventArgs(TextBox.TextChangedEvent));
}
public static readonly DependencyProperty TextBoxProperty =
DependencyProperty.Register("TextBoxObject", typeof(TextBox), typeof(FindPopupBehavior), new UIPropertyMetadata(null));
public object TextBoxObject
{
get { return (object)GetValue(TextBoxProperty); }
set { SetValue(TextBoxProperty, value); }
}
}
[编辑2]
在此弹出窗口关闭 ObservableCollection 时,文本框驻留在弹出窗口中,但文本框文本仍然存在,尽管是隐藏的。如果重新打开弹出窗口并且文本框有文本,则需要重新填充 ObservableCollection。它在 textchanged 行为中执行此填充。这就是为什么我想伪造一个事件。