WPF. Доступ к коллекции привязок во время выполнения

#wpf #data-binding

#wpf #привязка к данным

Вопрос:

У меня есть окно wpf с некоторыми элементами управления, привязанными к разным коллекциям.

 <controls:CustomTextBox ItemsSource="{Binding Countries}" />
<controls:CustomTextBox ItemsSource="{Binding Localities}" />
  

«ItemsSource» — это пользовательское свойство DependencyProperty для связи с коллекцией.
Я хочу получить коллекцию во время выполнения в PreviewLostKeyboardFocus для проверки, существует ли текст в коллекции.

 PreviewLostKeyboardFocus(object sender, KeyboardFocusChangedEventArgs e)
{
    CustomTextBox textBox = (CustomTextBox)sender;
    var bindingExpression = textBox.GetBindingExpression(textBox.ItemsSourceDependencyProperty);
    ...
}
  

Я получаю BindingExpression, но я не знаю, как искать текст в коллекции.
Спасибо.

Комментарии:

1. вы пытаетесь сделать что-то вроде автозаполнения?

Ответ №1:

Почему бы вам просто не получить доступ к оболочке CLR для свойства dependency?

 CustomTextBox textBox = (CustomTextBox)sender;
var collection = textBox.ItemsSource;
  

Чтобы вы могли «искать текст» в коллекции, вам, возможно, придется привести его к соответствующему типу, такому как, например, IEnumerable<string> или любой другой тип, который Countries или Localities является;

 var collection = textBox.ItemsSource as IEnumerable<string>;
if (collection != null)
{
    //...
} 
  

Комментарии:

1. Здравствуйте. Спасибо за ответ. Если я использую var collection = textbox. ItemsSource, я получаю нулевое значение. Тип, который я использую для ItemsSource (свойство Dependency), — List<dynamic>, потому что элементы могут быть нескольких типов. Например: страны (идентификатор, Iso, название) или населенные пункты (идентификатор, название, CountryId) или также Клиенты (идентификатор, код, имя, …). Я создаю пользовательский класс textbox, у которого есть другие свойства, такие как поле для поиска (Id, Iso …). Я использую их в xaml. Я думаю, лучший способ получить эту коллекцию, которую я нашел, — использовать выражение привязки. С помощью BindingExpression я получаю свойства привязки.

2. Если ItemsSource свойство возвращает null , ваше свойство dependency не было установлено. Попытка извлечь значение из выражения привязки не имеет значения.

3. Я нашел проблему. Я изменил тип свойства зависимости на IEnumerable, и теперь, если я использую var collection = textbox. ItemsSource, я получаю значения. Спасибо. И извините за мой английский.