Während ein ObservableCollection dafür verwendet werden kann, je nachdem, wie es verwendet wird, werden Sie keine benifit von ihm erhalten speichert. Das Schlüsselmerkmal der ObservableCollection ist, dass sie INotifyCollectionChanged implementiert. Diese Schnittstelle stellt einen Benachrichtigungsmechanismus bereit, um der Benutzeroberfläche mitzuteilen, dass eine Eigenschaft geändert wurde.Da ObservableCollection das bereits implementiert, wenn Sie die ItemSource -Eigenschaft von DataGrid, ListBox, ItemsControl usw. an eine Sammlung dieses Typs binden, wird die Benutzeroberfläche automatisch aktualisiert, sobald ein Element hinzugefügt/entfernt/ersetzt/verschoben/zurückgesetzt wird. Daher müssen Sie jedes Mal, wenn Sie die Sammlung mit einer neuen IEnumerable-Ergebnismenge aktualisieren möchten, zuerst die Sammlung löschen und dann die neuen Ergebnisse hinzufügen.
Es gibt jedoch eine andere Option, die ich in diesem Fall über eine ObservableCollection empfehlen würde. Es ist etwas zu verwenden, das als ObjectDataProvider bezeichnet wird. Damit können wir den Code vollständig vermeiden und er ist insgesamt viel sauberer. Also haben wir unseren Service irgendwo haben, in diesem Fall in meinem Window.xaml.cs
public class TranslationService
{
public IEnumerable<string> Translate(string s)
{
return s.ToCharArray().Select(c => c.ToString());
}
}
Wie der Service, den Sie beschreiben, es dauert es eine Zeichenfolge aus einer Textbox, und gibt eine IEnumerable. Jetzt können wir diesen Dienst im XAML verwenden und Anrufe tätigen.
Im Fenster declerations, fügen wir den Namespace für wo der Dienst befindet:
xmlns:local="clr-namespace:WpfApplication4"
nun in unserem Window.Resources (Oder Usercontrol oder anderswo) wir unseren Service verweisen können. Sobald wir unseren Dienst als Ressource bereitgestellt haben, können wir einen ObjectDataProvider erstellen, der die Translate-Methode verfügbar macht, die wir verwenden möchten.
<Window.Resources>
<local:TranslationService x:Key="MyTranslationService" />
<ObjectDataProvider x:Key="MyProvider"
ObjectInstance="{StaticResource MyTranslationService}"
MethodName="Translate">
<ObjectDataProvider.MethodParameters>
""
</ObjectDataProvider.MethodParameters>
</ObjectDataProvider>
</Window.Resources>
Der ObjectDataProvider ist mit unserem Service verknüpft und ruft die Translate-Methode mit einem String-Parameter auf. Jetzt müssen wir nur noch auf unser Textfeld reagieren.
Wir können dies tun, indem Sie einige der Bindungseigenschaften verwenden. Wir möchten, dass unsere TextProperty in der TextBox an den ObjectDataProvider gebunden wird. Daher legen wir fest, dass die Source-Eigenschaft darauf verweist. Der Teil des ObjectDataProvider, an den wir im Pfad binden möchten, ist der MethodParameter. Jetzt legen wir fest, dass es direkt an die Quelle dieser Eigenschaft gebunden wird und nur in eine Richtung geht, was bedeutet, dass der Methodenparameter des ObjectDataProvider den Text der TextBox nicht aktualisiert. Schließlich können wir den UpdateSourceTrigger auf PropertyChanged setzen und die Bindung angeben, um die Quelle festzulegen, an die wir binden, im Objektdatenprovider, wenn sich der Text ändert.
<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>
dass links Alles, was ist die Itemssource im Grid oder eine einfache List-Box in diesem Fall einzustellen.
In Bezug auf den letzten Teil auf dem Datagrid: Wenn Sie das Datenraster des WPFToolkit verwenden, tut es Feature ein Auto erzeugen, die durch die Eigenschaften eingestellt werden können, und Sie können mehr Informationen über sie here finden.
Sieht aus, als gäbe es hier eine gute Lektüre. Habe keine Zeit, sie jetzt zu überprüfen, werde aber zurückkehren, nachdem ich es getan habe. –