You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

WPF DevExpress LookUpEdit:AcceptEditorTextAsNewValue之外的新增值方法咨询

解决WPF DevExpress LookUpEdit输入列表外新值的替代方案

除了LookUpEdit.AcceptEditorTextAsNewValue属性,还有几种灵活的方式实现这个需求,下面我会结合实际代码示例逐一说明:

1. 手动监听输入并添加到数据源

这是最直接的方案,核心思路是开启文本编辑功能后,在合适的事件中检查输入内容,若不在现有数据源里就手动添加进去。

首先确保LookUpEdit允许编辑文本:

<dxg:LookUpEdit x:Name="myLookUpEdit" 
                IsTextEditable="True" 
                ItemsSource="{Binding MyDataSource}"
                Validate="MyLookUpEdit_Validate"/>

然后在后台代码中处理Validate事件(也可以用LostFocus或EditValueChanged事件,根据你的交互需求选择):

private void MyLookUpEdit_Validate(object sender, ValidationEventArgs e)
{
    var lookUp = sender as LookUpEdit;
    if (lookUp == null) return;
    
    var inputText = lookUp.Text.Trim();
    var dataSource = lookUp.ItemsSource as ObservableCollection<YourDataModel>;
    if (dataSource == null || string.IsNullOrEmpty(inputText)) return;
    
    // 检查输入是否已存在于数据源中
    var existingItem = dataSource.FirstOrDefault(item => item.DisplayProperty == inputText);
    if (existingItem == null)
    {
        // 创建新项并添加到数据源
        var newItem = new YourDataModel { DisplayProperty = inputText };
        dataSource.Add(newItem);
        // 设置EditValue为新项,确保选中状态正确
        lookUp.EditValue = newItem;
        e.IsValid = true;
    }
}

这种方式的优势是完全可控,你可以添加自定义逻辑(比如提示用户确认添加、校验输入格式等)。

2. 自定义弹出模板结合自由编辑

如果需要更个性化的交互,可以自定义LookUpEdit的弹出内容模板,同时保留可编辑的文本框区域。这种方式适合需要在弹出层添加额外操作(比如"添加新项"按钮)的场景。

示例XAML:

<dxg:LookUpEdit IsTextEditable="True" 
                ItemsSource="{Binding MyDataSource}"
                PopupWidth="300">
    <dxg:LookUpEdit.CustomPopupContentTemplate>
        <ControlTemplate>
            <DockPanel>
                <!-- 添加一个按钮用于手动触发添加新项 -->
                <Button DockPanel.Dock="Bottom" 
                        Content="添加新项"
                        Click="AddNewItem_Click"/>
                <!-- 保留默认的下拉列表 -->
                <dxg:GridControl x:Name="PART_GridControl" 
                                 ItemsSource="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=ItemsSource}">
                    <dxg:GridColumn FieldName="DisplayProperty" Header="选项"/>
                    <dxg:GridControl.View>
                        <dxg:TableView AutoWidth="True"/>
                    </dxg:GridControl.View>
                </dxg:GridControl>
            </DockPanel>
        </ControlTemplate>
    </dxg:LookUpEdit.CustomPopupContentTemplate>
</dxg:LookUpEdit>

后台按钮点击事件处理:

private void AddNewItem_Click(object sender, RoutedEventArgs e)
{
    var button = sender as Button;
    var lookUp = button.TemplatedParent as LookUpEdit;
    if (lookUp == null) return;
    
    var inputText = lookUp.Text.Trim();
    var dataSource = lookUp.ItemsSource as ObservableCollection<YourDataModel>;
    if (!string.IsNullOrEmpty(inputText) && dataSource != null)
    {
        if (!dataSource.Any(item => item.DisplayProperty == inputText))
        {
            dataSource.Add(new YourDataModel { DisplayProperty = inputText });
            lookUp.EditValue = dataSource.Last();
            lookUp.ClosePopup();
        }
    }
}

3. 结合自动补全与实时添加

开启LookUpEdit的自动补全功能,同时在文本变化时实时检查并添加新项(适合快速输入场景):

<dxg:LookUpEdit x:Name="autoCompleteLookUp" 
                IsTextEditable="True"
                AutoComplete="True"
                ItemsSource="{Binding MyDataSource}"
                TextChanged="AutoCompleteLookUp_TextChanged"/>

后台事件处理:

private void AutoCompleteLookUp_TextChanged(object sender, TextChangedEventArgs e)
{
    var lookUp = sender as LookUpEdit;
    var inputText = lookUp.Text.Trim();
    var dataSource = lookUp.ItemsSource as ObservableCollection<string>; // 假设数据源是字符串集合
    
    if (!string.IsNullOrEmpty(inputText) && dataSource != null && !dataSource.Contains(inputText))
    {
        // 这里可以添加延迟判断,避免用户还在输入时频繁添加
        // 比如用DispatcherTimer延迟500ms再执行添加逻辑
        dataSource.Add(inputText);
    }
}

需要注意的是,这种实时添加的方式要考虑用户输入的连贯性,建议添加延迟逻辑避免误操作。


内容的提问来源于stack exchange,提问作者SeeWICDo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 08:24:07