选择特定的ComboBoxItem时,如何将可编辑的ComboBox的文本更改为其他内容?

时间:2019-05-07 12:31:53

标签: c# wpf xaml combobox selectionchanged

新文本将永远不会出现在ComboBox内的项目中。下面是完整的XAML +代码隐藏,无法正常运行。我要达到的目的是让用户从组合框中选择一个实际的项目组,或者将一个 No Group (斜体,变灰)的项目选择为空ComboBox内的文本框中输入字符串。

我也尝试过:

  1. 带有StaysOpenOnEdit="True"(结果相同)和
  2. 通过处理Selected "click me"的{​​{1}}事件(在ComboBox的ComboBoxItemText属性更改之前调用事件处理程序)。

XAML

SelectedItem

隐藏代码

<Window x:Class="cs_wpf_test_12.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:cs_wpf_test_12"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800">
    <StackPanel Orientation="Vertical">
        <ComboBox SelectionChanged="ComboBox_SelectionChanged"
                  IsEditable="True">
            <ComboBoxItem>test</ComboBoxItem>
            <ComboBoxItem Foreground="Gray">click me</ComboBoxItem>
        </ComboBox>
    </StackPanel>
</Window>

预期::当用户单击下拉菜单中的“单击我”项目时,internal bool HandlingSelectionChange = false; private void ComboBox_SelectionChanged(object sender, SelectionChangedEventArgs e) { if (HandlingSelectionChange) { return; } HandlingSelectionChange = true; var cb = sender as ComboBox; if (cb.Text == "click me") { cb.Text = ""; e.Handled = true; } HandlingSelectionChange = false; } 的文本将变为空字符串。单击其余项目时,应将其文本正常复制到ComboBox的文本框中。

实际:

  1. 启动程序。
  2. 选择“点击我”项目。
  3. 文本更改为“单击我”(未变灰),而不是“”。
  4. 单击“测试”项。
  5. 文本更改为“”(空字符串),而不是“ test”。
  6. 再次单击“测试”项。
  7. 文本更改为“测试”。

更新

我希望使用MVVM,但我仍然是初学者。我在ComboBox中有多个ComboBox,如上所示,对于每个DataGridTemplateColumn(应该具有相同的下拉内容),我认为我应该有一个ViewModel每个ComboBox。如果可能的话,我想学习在这种情况下如何正确使用MVVM。

大XAML

ComboBoxItem

背后的大代码

<DataGridTemplateColumn Header="Group Name">
    <DataGridTemplateColumn.CellTemplate>
        <DataTemplate>
            <Label Content="{Binding GroupName, Mode=OneWay}">
            </Label>
        </DataTemplate>
    </DataGridTemplateColumn.CellTemplate>
    <DataGridTemplateColumn.CellEditingTemplate>
        <DataTemplate>
            <ComboBox IsEditable="True" StaysOpenOnEdit="True"
                        ItemsSource="{Binding Path=Clocks.GroupsVM,
                RelativeSource={RelativeSource AncestorType=local:ClockDataGrid}}"
                        PreviewKeyDown="ComboBox_PreviewKeyDown"
                        SelectionChanged="ComboBox_SelectionChanged"
                        Text="{Binding GroupName}">
                <ComboBox.Resources>
                    <Style TargetType="ComboBoxItem">
                        <Setter Property="FontStyle" Value="{Binding FontStyle}"/>
                        <Setter Property="Foreground" Value="{Binding Foreground}"/>
                    </Style>
                </ComboBox.Resources>
            </ComboBox>
        </DataTemplate>
    </DataGridTemplateColumn.CellEditingTemplate>
</DataGridTemplateColumn>

1 个答案:

答案 0 :(得分:1)

ComboBox.Text将不会在SelectionChanged事件中立即更新。您可以改用SelectedValue的内容。并将SelectedValue设置为null。像这样更改您的if条件。

if ((cb.SelectedValue as ComboBoxItem).Content.ToString() == "click me")
{
    cb.Text = "";
    cb.SelectedValue = null;
    e.Handled = true;
}