因此,我将我的一些组合框转换为可编辑的组合框,因为客户希望自由输入新条目。组合框由具有实体框架的查找表填充,并且需要将新条目添加到查找表中。我扩展了组合框以在焦点离开组合框时生成一个事件,该组合框将新条目添加到表中:
private void CollectionComboBox_NewItem(object sender, NewItemEventArgs e)
{
var newItem = new Collection() { Name = e.Text };
_context.Collections.Add(newItem);
e.Item = newItem;
}
这一切似乎都运行良好,但要使其正常运行,我必须将绑定到实体从使用 SelectedValue 切换到 SelectedItem,因为控件上的验证器会触发,因为尚未为新记录分配 ID。
保存记录时出现的问题是已经存在的项目将另一条记录添加到数据库中。我知道它与切换到 SelectedItem 而不是我的自定义组合框有关,因为它与普通组合框表现出相同的行为。
我的组合框 XAML:
<dock:EditableComboBox Grid.Row="1" Grid.Column="1" Grid.ColumnSpan="3" x:Name="CollectionComboBox" Margin="12,5,18,0"
NewItem="CollectionComboBox_NewItem" MaxLength="100"
HorizontalAlignment="Stretch"
ItemsSource="{Binding Source={StaticResource CollectionViewSource}}" DisplayMemberPath="Name"
SelectedValuePath="CollectionID" IsSynchronizedWithCurrentItem="False"
x:FieldModifier="private"
SelectedItem="{Binding Collection, UpdateSourceTrigger=PropertyChanged}">
<dock:EditableComboBox.Text>
<Binding RelativeSource="{RelativeSource Self}" Path="Text" UpdateSourceTrigger="LostFocus">
<Binding.ValidationRules>
<gui:RequiredComboValidator ValidatesOnTargetUpdated="True" />
</Binding.ValidationRules>
</Binding>
</dock:EditableComboBox.Text>
</dock:EditableComboBox>
集合视图来源:
<CollectionViewSource x:Key="CollectionViewSource"
d:DesignSource="{d:DesignInstance storeAndForward:Collection, CreateList=True}">
<CollectionViewSource.SortDescriptions>
<windowsBase:SortDescription Direction="Ascending" PropertyName="Name" />
</CollectionViewSource.SortDescriptions>
</CollectionViewSource>