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