WPF に編集可能なコンボボックスがあります (IsEditable=True)。また、ユーザーが入力した値がリストにのみ含まれるようにしたいと思います。ユーザーが独自の値をコンボに追加したくありません。ユーザーが入力できないため、 IsReadonly=true にすることはできません。では、検証は SelectionChange イベントの唯一のオプションですか? または同じことを行うより良い方法はありますか?
ありがとうシャンカラ・ナラヤナン。
テストを赤くすることで、入力が無効であることをユーザーに知らせるようにしました。しかし、同様のアプローチを使用して別のことを行うこともできます。
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));
}
}
}
わかりました..これが私がしたことです
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 イベントにあります。
これが最善の方法であるかどうかはわかりませんが、目的には役立ちます
ありがとう
シャンカラ・ナラヤナン