これには ObservableCollection を使用できますが、使用方法によっては、何のメリットも得られません。ObservableCollection の重要な機能は、INotifyCollectionChanged を実装することです。このインターフェイスが行うことは、プロパティが変更されたことを UI に伝える通知メカニズムを提供することです。ObservableCollection は既にこれを実装しているため、DataGrid、ListBox、ItemsControl などの ItemSource プロパティをこのタイプのコレクションにバインドすると、アイテムが追加/削除/置換/移動/リセットされるたびに UI が自動的に更新されます。このため、新しい IEnumerable 結果セットでコレクションを更新するたびに、最初にコレクションをクリアしてから、新しい結果を追加する必要があります。
ただし、この場合、ObservableCollection よりもお勧めする別のオプションがあります。ObjectDataProvider と呼ばれるものを使用することです。これを使用すると、コード ビハインドを完全に回避でき、全体的にはるかにクリーンになります。したがって、この場合は Window.xaml.cs のどこかにサービスがあります。
public class TranslationService
{
public IEnumerable<string> Translate(string s)
{
return s.ToCharArray().Select(c => c.ToString());
}
}
あなたが説明したサービスと同様に、テキストボックスから文字列を取得し、IEnumerable を返します。これで、XAML でこのサービスを使用して呼び出すことができます。
ウィンドウの宣言では、サービスが配置されている場所の名前空間を追加します。
xmlns:local="clr-namespace:WpfApplication4"
これで、Window.Resources (または UserControl など) でサービスを参照できます。サービスをリソースとして公開したら、使用したい Translate メソッドを公開する ObjectDataProvider を作成できます。
<Window.Resources>
<local:TranslationService x:Key="MyTranslationService" />
<ObjectDataProvider x:Key="MyProvider"
ObjectInstance="{StaticResource MyTranslationService}"
MethodName="Translate">
<ObjectDataProvider.MethodParameters>
""
</ObjectDataProvider.MethodParameters>
</ObjectDataProvider>
</Window.Resources>
ObjectDataProvider は Service に関連付けられており、String パラメーターを使用して Translate メソッドを呼び出します。あとは、テキスト ボックスに応答させるだけです。
これを行うには、いくつかの Binding プロパティを利用します。TextBox の TextProperty を ObjectDataProvider にバインドする必要があるため、それを指すように Source プロパティを設定します。Path でバインドする ObjectDataProvider の部分は MethodParameter です。ここで、そのプロパティのソースに直接バインドし、一方向のみ移動するように設定します。つまり、ObjectDataProvider のメソッド パラメーターは TextBox のテキストを更新しません。最後に、UpdateSourceTrigger を PropertyChanged に設定して、テキストに変更があるたびに、オブジェクト データ プロバイダーでバインド先のソースを設定するようバインディングに指示できます。
<StackPanel>
<TextBox TextChanged="OnTextChanged"
Text="{Binding Source={StaticResource MyProvider}, Path=MethodParameters[0], BindsDirectlyToSource=True, Mode=OneWayToSource, UpdateSourceTrigger=PropertyChanged}" />
<ListBox ItemsSource="{Binding Source={StaticResource MyProvider}}" />
</StackPanel>
あとは、Grid に ItemsSource を設定するか、この場合は単純な ListBox を設定するだけです。
DataGrid の最後の部分について: WPFToolkit のデータ グリッドを使用している場合、プロパティを介して設定できる自動生成機能があり、詳細についてはこちらを参照してください。