在ViewModel中处理ComboBox TextChanged / DropDownOpened

时间:2013-08-15 11:28:45

标签: wpf xaml binding combobox mouseevent

我想在ViewModel中处理ComboBox的DropDownOpened事件。我怎么能这样做。

基本上我的Comboxbox的ItemSource绑定到一个集合。这个集合可以改变,我不知道它什么时候改变。所以我想要做的是,每次用户点击组合框时我想重新填充ComboBox(打开下拉列表)。我怎么能在ViewModel中做到这一点。

非常感谢提前。

1 个答案:

答案 0 :(得分:0)

在我看来,使用视图模型处理WPF中UI事件的最佳方法是实现Attached Properties。以下是我用来监视LostFocus事件的示例...而不是将EventArgs对象传递给视图模型,我正在公开ICommand的基本实例(你是可以在您的视图模型中实现当焦点从关联的TextBox

中丢失时将被调用
public static DependencyProperty OnLostFocusProperty = DependencyProperty.
RegisterAttached("OnLostFocus", typeof(ICommand), typeof(TextBoxProperties), new 
UIPropertyMetadata(null, OnLostFocusChanged));

public static ICommand GetOnLostFocus(DependencyObject dependencyObject)
{
    return (ICommand)dependencyObject.GetValue(OnLostFocusProperty);
}

public static void SetOnLostFocus(DependencyObject dependencyObject, ICommand value)
{
    dependencyObject.SetValue(OnLostFocusProperty, value);
}

public static void OnLostFocusChanged(DependencyObject dependencyObject, 
DependencyPropertyChangedEventArgs e)
{
    TextBox textBox = dependencyObject as TextBox;
    if (e.OldValue == null && e.NewValue != null) textBox.LostFocus += TextBox_LostFocus;
    else if (e.OldValue != null && e.NewValue == null) textBox.LostFocus -= TextBox_LostFocus;
}

private static void TextBox_LostFocus(object sender, RoutedEventArgs e)
{
    TextBox textBox = sender as TextBox;
    ICommand command = GetOnLostFocus(textBox);
    if (command != null && command.CanExecute(textBox)) command.Execute(textBox);
    e.Handled = false;
}

您可以这样使用它:

<TextBox Text="{Binding SomeValue}" Attached:TextBoxProperties.OnLostFocus="{Binding 
YourCommandName}" />

我确信您可以进行一些更改,以便能够将其应用到您的情况中。如果您不熟悉Attached Properties,请查看MSDN上的Attached Properties Overview页面。