1

ユーザーが有効な ConnectionString を作成するために必要なすべての値 (UserID、IntegratedSecurity など) を入力できる ConnectionString ダイアログを実装しようとしています。

このエンドポイントで見つけることができるすべての利用可能なデータベースを登録する ComboBox もあります。この ComboBox は、ユーザー ID などのユーザーが変更されたときではなく、開かれたときにのみ ItemsSource にバインドする必要があります。

値が表示されているとき (たとえば、コンボボックスを開くとき) にだけ、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 で提供されている 2 つの添付プロパティを使用します。

        <ComboBox a:ItemsSourceBindingOnOpenBehavior.Source="{Binding ViewModelCollection}"/>
于 2013-07-04T10:49:03.627 に答える