我看到有一些类似的问题要问我,但我一直在阅读它们,但仍不确定如何解决我的问题。我只使用WPF几个月,所以请原谅我,如果我遗漏了一些明显的东西。
我在我正在处理的应用程序中包含一个开源控件,它是一个自动完成的文本框:https://wpfautocomplete.codeplex.com/ 这个控件在vba中,我在C#中工作 - 我可以跟踪它中发生的事情,但它不是我强大的语言。
在此控件中,当AutoCompleteTextBox中的所选项目发生更改时会发生一个事件:
Shared Sub OnSelectedItemChanged(ByVal d As DependencyObject, ByVal e As DependencyPropertyChangedEventArgs)
Dim act As AutoCompleteTextBox
act = TryCast(d, AutoCompleteTextBox)
If act IsNot Nothing Then
If act.Editor IsNot Nothing And Not act._isUpdatingText Then
act._isUpdatingText = True
act.Editor.Text = act.BindingEvaluator.Evaluate(e.NewValue)
act._isUpdatingText = False
End If
End If
End Sub
当发生这种情况时,我想在我的应用程序中调用一个传递对象e
以允许对其进行处理的事件。我目前正在研究UIElement.RaiseEvent method。我是在正确的轨道上吗?
如果是这样,那么如何在我使用此控件的c#wpf应用程序的xaml / codebehind中“捕获”引发的事件?
提前致谢。
答案 0 :(得分:2)
您正在查看的方法由用户控件在内部使用,以便在SelectedItem
属性的值发生更改时执行某些操作,并且不会有太多用处(除非您修改源代码 - 您可以添加event
并从该方法中提升它。 " WPF方式"是使用数据绑定,但这假设您使用的是MVVM。只需将控件的SelectedItem属性绑定到视图模型上的属性,如下所示: -
<wpf:AutoCompleteTextBox SelectedItem="{Binding SelectedItem}" ...
听起来你并没有使用MVVM。如果没有,一个解决方案是使用您的代码隐藏类作为&#34;视图模型&#34;。在构造函数中,将其自身设置为DataContext,例如:
public YourConstructor()
{
InitializeComponent();
DataContext = this;
}
现在,您可以将XAML控件属性绑定到代码隐藏类的属性。确保代码隐藏类实现了INotifyPropertyChanged接口(例如here),然后添加一个将绑定控件的SelectedItem属性的属性: -
public object SelectedItem
{
get { return _selectedItem; }
set
{
if (_selectedItem != value)
{
_selectedItem = value;
OnPropertyChanged("SelectedItem");
// Do whatever you need to, when the selected item changes
}
}
}
将此绑定到控件的SelectedItem属性(根据我之前的XAML代码段),你应该很高兴。这为您提供了一种利用数据绑定的简单方法,而无需使用完整的MVVM应用程序。