从库中的控制中提升事件

时间:2014-08-21 23:15:47

标签: wpf vb.net wpf-controls

我看到有一些类似的问题要问我,但我一直在阅读它们,但仍不确定如何解决我的问题。我只使用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中“捕获”引发的事件?

提前致谢。

1 个答案:

答案 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应用程序。