仅在打开时绑定组合框ItemsSource

时间:2013-07-04 09:46:34

标签: wpf binding combobox refresh late-binding

我正在尝试实现一个ConnectionString对话框,用户可以在其中输入创建有效ConnectionString所需的所有值,例如: UserID,IntegratedSecurity等....

还有一个ComboBox,它可以在此端点找到所有可用的数据库。此ComboBox只应在打开时绑定到ItemsSource,而不是在用户更改时绑定到UserID。

只有在显示值时(例如打开组合框时),才能轻松刷新ItemsSource值。问题是,当用户输入无效值时,总会出现异常,因为用户尚未完成输入所有必要值。

我已经尝试使用事件ComboBox_DropDownOpened来实现它,但我想知道是否有更实用的方法来实现这一点。我注意到有一个BindingProperty“UpdateSourceTrigger”但我不知道我是否可以用它来解决我的问题。

感谢您的帮助!

<ComboBox Text="{Binding InitialCatalog}"
 SelectedValue="{Binding InitialCatalog}" 
ItemsSource="{Binding Databases}" IsEditable="True"/>

1 个答案:

答案 0 :(得分:3)

如果事件ComboBox_DropDownOpened正在运行,您可以将其包装在一个看似如下的行为中:

internal class ItemsSourceBindingOnOpenBehavior
{
    public static readonly DependencyProperty SourceProperty =
        DependencyProperty.RegisterAttached("Source", typeof(ObservableCollection<string>),
                                            typeof(ItemsSourceBindingOnOpenBehavior),
                                            new UIPropertyMetadata(null, OnSourceChanged));

    public static ObservableCollection<string> GetSource(DependencyObject obj)
    {
        return (ObservableCollection<string>)obj.GetValue(SourceProperty);
    }

    public static void SetSource(DependencyObject obj, ObservableCollection<string> value)
    {
        obj.SetValue(SourceProperty, value);
    }

    private static void OnSourceChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        SetSource(d);
    }

    private static void SetSource(DependencyObject d)
    {
        var cbo = d as ComboBox;
        if (cbo != null) cbo.DropDownOpened += (s, a) => { cbo.ItemsSource = GetSource(cbo); };
    }
}

要激活行为,请使用XAML中提供的两个附加属性:

        <ComboBox a:ItemsSourceBindingOnOpenBehavior.Source="{Binding ViewModelCollection}"/>