まず第一に、linq を使用してユーザー入力のテキスト ボックスを介して観察可能なコレクションをフィルター処理することについては多くの回答がありますが、コードの実行時については何もありませんが、英語で入力することはできません。
私のコードを説明するために、韓国語の名前と英語の名前を表す 2 つの文字列プロパティ KName と EName を持つ単純なクラス Person があります。これらの Person を保持するのは、persons という名前の ObservableCollection になります。
class Person
{
public string KName { get; set; }
public string EName { get; set; }
}
と
ObservableCollection<Person> persons;
public MainPage()
{
this.InitializeComponent();
persons = new ObservableCollection<Person>();
Person s = new Person();
s.KName = "홍길동";
s.EName = "Hong Kil-dong";
persons.Add(s);
Person t = new Person();
t.KName = "김지영";
t.EName = "Kim Ji-young";
persons.Add(t);
Person u = new Person();
u.KName = "최철수";
u.EName = "Choi Chul-soo";
persons.Add(u);
this.DataContext = persons;
}
xaml 側には、検索を処理するために Enter キーが押されたかどうかを確認する KeyDown イベント ハンドラーと、フィルターの結果を表示する ListView を含むテキスト ボックスがあります。
<Page
x:Class="TextboxTest.MainPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="using:TextboxTest"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d">
<Grid Background="{StaticResource ApplicationPageBackgroundThemeBrush}">
<TextBox x:Name="SearchTextBox" Height="70" Margin="15"
VerticalAlignment="Top" KeyDown="SearchTextBox_Enter"/>
<ListView x:Name="SearchResults" Margin="15" Height="500">
<ListView.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal" Margin="5" HorizontalAlignment="Left">
<TextBlock Width="200" Text="{Binding Path=KName}"
TextAlignment="Left" HorizontalAlignment="Left" />
<TextBlock Width="200" Text="{Binding Path= EName}" />
</StackPanel>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
</Grid>
</Page>
および KeyDown ハンドラ
private void SearchTextBox_Enter(object sender, KeyRoutedEventArgs e)
{
if (e.Key == Windows.System.VirtualKey.Enter)
{
string txt = SearchTextBox.Text;
if(SearchResults.SelectedItem != null)
SearchResults.SelectedItem = null;
var filter = from Person in persons
let kname = Person.KName
let ename = Person.EName
where ename.Contains(txt) ||
kname.Contains(txt)
orderby kname
select Person;
SearchResults.ItemsSource = filter;
}
e.Handled = true;
}
だから私の問題は、韓国語で入力できるのに、テキストボックスに英語で入力できないことです。別の場所から英語のテキストをコピーしてテキスト ボックスに貼り付けると、期待どおりにフィルタリングされます。テキストボックスから KeyDown ハンドラーを削除すると、英語で正しく入力されます。したがって、問題は KeyDown ハンドラにあるはずです。誰かが私のコードに何か問題があると思いますか? または、これを行うためのより良い方法はありますか?