#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, я получаю значения. Спасибо. И извините за мой английский.