【问题标题】:Editable combobox with valid selection具有有效选择的可编辑组合框
【发布时间】:2012-11-06 21:35:58
【问题描述】:

我在 WPF 中有一个可编辑的组合框 (IsEditable=True)。我还想确保用户输入的值仅在列表中。我不希望用户将自己的值添加到组合中。我不能让 IsReadonly=true 因为那将不允许用户输入。那么验证是 SelectionChange 事件中的唯一选项吗?还是有更好的方法来做同样的事情?

谢谢 Shankara Narayanan。

【问题讨论】:

  • 不知道你喜欢什么样的行为?
  • 只是我不希望用户在下拉菜单中输入任何其他内容

标签: c# .net wpf


【解决方案1】:

我这样做是为了让用户通过将测试设为红色来告知他们的输入无效。但是您可以使用类似的方法来做其他事情。

XAML:

<Window x:Class="local.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:EditableComboBox="clr-namespace:EditableComboBox"
    Title="MainWindow" Height="350" Width="525">
    <Window.DataContext>
        <EditableComboBox:ComboBoxViewModel />
    </Window.DataContext>
    <StackPanel>
        <ComboBox IsEditable="True" Foreground="{Binding ComboBoxColor, Mode=TwoWay}" Text="{Binding ComboBoxText, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />
    </StackPanel>
</Window>

代码:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Text;
using System.Windows.Media;

namespace EditableComboBox
{
    class ComboBoxViewModel : INotifyPropertyChanged
    {
        public event PropertyChangedEventHandler PropertyChanged;

        private string m_ComboBoxText;
        public string ComboBoxText
        {
            get { return m_ComboBoxText; }
            set
            {
                m_ComboBoxText = value;
                OnPropertyChanged("ComboBoxText");
                ValidateText();
            }
        }

        private void ValidateText()
        {
            if (ComboBoxText.Length % 2 == 0)
                ComboBoxColor = Brushes.Black;
            else
                ComboBoxColor = Brushes.Red;
        }

        private Brush m_ComboBoxColor;
        public Brush ComboBoxColor
        {
            get { return m_ComboBoxColor; }
            set
            {
                m_ComboBoxColor = value;
                OnPropertyChanged("ComboBoxColor");
            }
        }

        protected virtual void OnPropertyChanged(string propertyName)
        {
            PropertyChangedEventHandler handler = PropertyChanged;
            if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName));
        }
    }
}

【讨论】:

    【解决方案2】:

    好吧..这就是我所做的

    List<dynamic> list = cmbToAcc.ItemsSource as List<dynamic>;
            var result = from s in list
                         where (string)s.Name == (string)cmbToAcc.Text
                         select s;
    
            if (result.Count() <= 0)
            {
                Helper.Inform("Please select a valid value.");
                cmbToAcc.SelectedIndex = 0;
                cmbToAcc.Focus();
            }
    

    这是在 LostFocus 事件中。

    我不确定这是否是最好的方法......但可以达到目的

    谢谢

    香卡拉·纳拉亚南

    【讨论】:

      猜你喜欢
      • 2023-04-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-27
      • 1970-01-01
      • 2015-10-07
      • 2017-02-11
      相关资源
      最近更新 更多