Хотя ObservableCollection может использоваться для этого, в зависимости от того, как она используется не будет никакого benifit Получать от него. Ключевой особенностью ObservableCollection является то, что он реализует INotifyCollectionChanged. Что делает этот интерфейс, так это механизм уведомления о том, что пользовательский интерфейс изменил свойство.Поскольку ObservableCollection уже реализует это, если вы привязываете свойство ItemSource DataGrid, ListBox, ItemsControl и т. Д. К коллекции этого типа, он автоматически обновляет пользовательский интерфейс в любое время, когда элемент будет добавлен/удален/заменен/перемещен/сброс. Из-за этого каждый раз, когда вы хотите обновить коллекцию новым набором результатов IEnumerable, вам придется сначала очистить коллекцию, а затем добавить новые результаты.
Однако есть еще один вариант, который я бы рекомендовал в ObservableCollection в этом случае. Он должен использовать что-то, называемое ObjectDataProvider. Используя это, мы можем полностью избежать кода, и в целом он намного чище. Таким образом, мы имеем нашу службу где-то, в данном случае в моем Window.xaml.cs
public class TranslationService
{
public IEnumerable<string> Translate(string s)
{
return s.ToCharArray().Select(c => c.ToString());
}
}
Как сервиса вы описали, он принимает его строку из текстового поля, и возвращает IEnumerable. Теперь в XAML мы можем использовать эту услугу и звонить на нее.
В окне declerations мы добавляем пространство имен, где находится служба:
xmlns:local="clr-namespace:WpfApplication4"
Теперь в наших Window.Resources (или UserControl, или в другом месте), мы можем ссылаться на наш сервис. После того как мы разоблачили нашу службу как ресурс, мы можем создать 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 привязан к нашей службе и вызывает метод Translate с параметром String. Теперь все, что нам нужно сделать, это заставить его ответить на наше текстовое поле.
Мы можем сделать это, используя некоторые свойства связывания. Мы хотим, чтобы наш TextProperty в TextBox связывался с ObjectDataProvider, поэтому мы установили свойство Source для указания на него. Часть объекта ObjectDataProvider, который мы хотим связать, в Пути, является MethodParameter. Теперь мы привязываем его к Bind непосредственно к источнику этого свойства и только перемещаемся в одну сторону, а это означает, что параметр метода 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>
Все, что осталось установить ItemsSource в сетке, или простой ListBox в данном случае.
Что касается заключительной части на DataGrid: При использовании сетки данных в WPFToolkit, он имеет автоматический генерировать функцию, которая может быть установлена через свойство, и вы можете найти более подробную информацию о нем here.
Похоже, здесь есть хорошее чтение. У меня нет времени, чтобы проверить их сейчас, но вернусь после того, как у меня есть. –