1

我正在尝试实现一个 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"/>
4

1 回答 1

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}"/>
于 2013-07-04T10:49:03.627 回答