wpf 使用ComboBox.Text选择一个项目时,奇怪的ComboBox行为

gfttwv5a  于 12个月前  发布在  其他
关注(0)|答案(1)|浏览(79)

我们来举个例子。

<ComboBox x:Name="cmbTest" IsEditable="False">
   <ComboBoxItem Content="7"/>
   <ComboBoxItem Content="ab"/>
   <ComboBoxItem Content="abc 1"/>
   <ComboBoxItem Content="abc"/>
   <ComboBoxItem Content="8 (1)"/>
   <ComboBoxItem Content="8 (2)"/>
   <ComboBoxItem Content="9"/>
   <ComboBoxItem Content="8"/>
   <ComboBoxItem Content="100"/>
   <ComboBoxItem Content="10"/>
   <ComboBoxItem Content="1"/>
 </ComboBox>

字符串
然后尝试代码中的每一行:

cmbTest.Text = "7";      //Correctly selected, .SelectedIndex = 0
cmbTest.Text = "ab";     //Correctly selected, .SelectedIndex = 1
cmbTest.Text = "abc 1";  //Correctly selected, .SelectedIndex = 2
cmbTest.Text = "abc";    //Nothing selected,   .SelectedIndex = -1
cmbTest.Text = "8 (1)";  //Correctly selected, .SelectedIndex = 4
cmbTest.Text = "8 (2)";  //Correctly selected, .SelectedIndex = 5
cmbTest.Text = "9";      //Correctly selected, .SelectedIndex = 6
cmbTest.Text = "8";      //Nothing selected,   .SelectedIndex = -1
cmbTest.Text = "100";    //Correctly selected, .SelectedIndex = 8
cmbTest.Text = "10";     //Nothing selected,   .SelectedIndex = -1
cmbTest.Text = "1";      //Nothing selected,   .SelectedIndex = -1


任何以任何前一项的子字符串开头的项都未正确选择。
IsEditable=True。项目显示/选择正确,但返回为SelectedIndex(同上)。
除了迭代和使用SelectedIndex来选择一个项目(我做了什么来修复这个问题),有没有办法修复这个行为?也许我错过了什么?

qoefvg9y

qoefvg9y1#

我还经历了默认组合框的糟糕UX配置。
我不知道你想要的对不对,但我是这样解决的。

// override default ComboBox
// MyComboBox.cs
public class MyComboBox : ComboBox
{
    private TextBox PART_EditableTextBox;
    public override void OnApplyTemplate()
    {
        if (PART_EditableTextBox != null)
            PART_EditableTextBox.LostFocus -= PART_EditableTextBox_LostFocus;
        base.OnApplyTemplate();

#warning it works only when 'IsEditable' property is 'True'
        FrameworkElement root = GetVisualChild(0) as FrameworkElement;
        PART_EditableTextBox = (TextBox)root.FindName("PART_EditableTextBox");
        PART_EditableTextBox.LostFocus += PART_EditableTextBox_LostFocus;
    }
    private void PART_EditableTextBox_LostFocus(object sender, RoutedEventArgs e)
    {
        try
        {
            if (PART_EditableTextBox == null) return;
            else if (string.IsNullOrWhiteSpace(DisplayMemberPath))
                if (SelectedItem is ComboBoxItem comboBoxItem)
                    PART_EditableTextBox.Text = comboBoxItem.Content?.ToString();
                else
                    PART_EditableTextBox.Text = SelectedItem?.ToString();
            else PART_EditableTextBox.Text = SelectedItem?.GetType().GetProperty(DisplayMemberPath)?.GetValue(SelectedItem)?.ToString();
        }
        catch { }
    }
}

字符串
这个想法的核心是当用户认为他们已经做出了选择时,向用户给予适当的反馈(当'LostFocus'事件触发时)。

<Window x:Class="test.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="clr-namespace:test"
    Title="MainWindow" Height="450" Width="800">
<StackPanel>
    <local:MyComboBox IsEditable="True">
        <ComboBoxItem Content="7"/>
        <ComboBoxItem Content="ab"/>
        <ComboBoxItem Content="abc 1"/>
        <ComboBoxItem Content="abc"/>
        <ComboBoxItem Content="8 (1)"/>
        <ComboBoxItem Content="8 (2)"/>
        <ComboBoxItem Content="9"/>
        <ComboBoxItem Content="8"/>
        <ComboBoxItem Content="100"/>
        <ComboBoxItem Content="10"/>
        <ComboBoxItem Content="1"/>
    </local:MyComboBox>
    <TextBox/>
</StackPanel>

相关问题