2

WPF に編集可能なコンボボックスがあります (IsEditable=True)。また、ユーザーが入力した値がリストにのみ含まれるようにしたいと思います。ユーザーが独自の値をコンボに追加したくありません。ユーザーが入力できないため、 IsReadonly=true にすることはできません。では、検証は SelectionChange イベントの唯一のオプションですか? または同じことを行うより良い方法はありますか?

ありがとうシャンカラ・ナラヤナン。

4

2 に答える 2

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));
        }
    }
}
于 2012-11-06T23:30:29.990 に答える
0

わかりました..これが私がしたことです

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 イベントにあります。

これが最善の方法であるかどうかはわかりませんが、目的には役立ちます

ありがとう

シャンカラ・ナラヤナン

于 2012-11-06T23:55:24.740 に答える