【问题标题】:Change ComboBox text but not selected item更改 ComboBox 文本但未选择项
【发布时间】:2014-03-03 22:58:40
【问题描述】:

我有一个 ComboBox,其中包含我的应用程序中定义的每个 FilterViewModel 的项目。每个 FilterViewModel 都有一个 DisplayName 属性,其中包含过滤器的名称。当前选择的过滤器实例保存在 SelectedFilter 属性中。

我希望用户能够从下拉列表中选择现有项目,同时在文本框中更改所选过滤器的名称。输入其他名称不得更改项目选择。总是选择一个过滤器,永远不可能没有选择过滤器。

这是 XAML 代码:

<ComboBox
    IsEditable="True" IsTextSearchEnabled="False"
    ItemsSource="{Binding Filters}"
    SelectedItem="{Binding SelectedFilter}"
    DisplayMemberPath="DisplayName"/>

我找不到 ComboBox 的 TextChanged 事件,简单地让它保持原样不会更改所选项目的绑定文本属性 DisplayName(我早就料到了)。

我可以怎样做才能让它按上述方式工作?

背景是这个 ComboBox 在我的应用程序的设置对话框中使用,可以管理(创建、复制、重命名、删除)过滤器,并且可以编辑它们的过滤条件。我想为我节省额外的按钮和窗口或文本框来重命名过滤器,但直接就地提供该功能。您会看到过滤器名称,只需单击它并键入即可更改它。但我也想使用 ComboBox 有一个下拉选择菜单来切换过滤器。

【问题讨论】:

    标签: c# wpf combobox


    【解决方案1】:

    这应该允许您更改SelectedFilterDisplayName 而无需更改SelectedFilter 本身:

    <ComboBox 
        ItemsSource="{Binding Filters}" 
        SelectedItem="{Binding SelectedFilter}" 
        DisplayMemberPath="DisplayName"
        Text="{Binding SelectedFilter.DisplayName, Mode=TwoWay}"
        IsEditable="True" 
        IsTextSearchEnabled="False"/>
    

    【讨论】:

    • 太棒了!简单有效的解决方案。这里有一些代码将选择 ComboBox 中的所有文本。它可以与 SelectionChanged 事件挂钩:stackoverflow.com/a/2151815/143684
    • 非常感谢。我在测试时发现了一些东西,如果 IsTextSearchEnabled 为真,则 SelectedFilter 将在更改 DisplayName 时更改为 null,因此我在 set 分支上的属性中添加了一个额外的检查: if (value != null) { _SelectedFilter = value ; PropertyChanged(this, new PropertyChangedEventArgs("SelectedFilter")); } 。现在它适用于我的场景,没有你的例子我无法到达这里。
    猜你喜欢
    • 2018-07-30
    • 2013-03-03
    • 1970-01-01
    • 1970-01-01
    • 2013-03-10
    • 2023-01-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多