提案リストからのみアイテムを選択するように WPF AutoCompleteBox (wpf ツールキット コントロール) を制限したいと思います。ユーザーが好きなように入力できるようにすべきではありません。
誰かがこれを実装する方法を提案できますか? サンプルコードは大歓迎です。
提案リストからのみアイテムを選択するように WPF AutoCompleteBox (wpf ツールキット コントロール) を制限したいと思います。ユーザーが好きなように入力できるようにすべきではありません。
誰かがこれを実装する方法を提案できますか? サンプルコードは大歓迎です。
これが私がやった方法です。派生クラスを作成し、OnPreviewTextInput をオーバーライドします。コレクションをコントロールの ItemsSource プロパティに設定すると、うまく機能するはずです。
public class CurrencySelectorTextBox : AutoCompleteBox
{
protected override void OnPreviewTextInput(TextCompositionEventArgs e)
{
var currencies = this.ItemsSource as IEnumerable<string>;
if (currencies == null)
{
return;
}
if (!currencies.Any(x => x.StartsWith(this.Text + e.Text, true, CultureInfo.CurrentCulture))
{
e.Handled = true;
}
else
{
base.OnPreviewTextInput(e);
}
}
}
例としてこのように、プロパティにデータバインドしている場合
<sdk:AutoCompleteBox ItemsSource="{Binding Sites, Source={StaticResource VmSchedulel}}" ValueMemberPath="SiteName"
SelectedItem="{Binding Site, Mode=TwoWay}" FilterMode="ContainsOrdinal">
<sdk:AutoCompleteBox.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding SiteName}"/>
</DataTemplate>
</sdk:AutoCompleteBox.ItemTemplate>
</sdk:AutoCompleteBox>
ItemsSource のいずれとも一致しないテキストが入力された場合、SelectedItem は null と等しくなります。プロパティの set メソッドでは、null であるため値を設定できず、プロパティは元の値を保持します。
set
{
if (value != null)
{
BaseRecord.SiteID = value.ID;
PropChanged("Site");
}
}
Priview キーダウン イベントでユーザーを制限できます。うまくいくことを願っています...