Есть ListBox и TextBox, первый подвязан под ObservableCollection<Adress>, где Adress -
public struct Adress
{
public Adress(string text, double x, double y)
{
Text = text;
X = x;
Y = y;
}
public string Text { get; set; }//Именно это свойство отображается в "ListboxItem"
public double X { get; set; }
public double Y { get; set; }
}
TextBox подвязан к свойству-строке, в сеттере которой я пробовал проводить фильтрацию, но всё тщетно. Фильтровать пробовал с помощью ICollectionView, но не разобрался как именно достичь желаемого результата.
А теперь о том, что же собой представляет желаемый результат - при вводе текста в TextBox, те элементы в ListBox'е, которые содержат этот текст(вне зависимости от регистра) - остаются видимыми, а остальные "прячутся"(думаю просто использовать Visibility.Collapsed, но тут уж все средства будут хороши). Вот не могу понять, как это реализовать не нарушая принципов MVVM.
В итоге разобрался сам, всему виной была моя собственная невнимательность - я не правильно указал Binding для TextBox:
<TextBox Text="{Binding AdressFilterText}"/>
Таким образом следующий код является полностью рабочим:
<TextBox Text="{Binding AdressFilterText, UpdateSourceTrigger=PropertyChanged}"/>
<ListBox ItemsSource="{Binding Adresses}"/>
И C#:
public ObservableCollection<Adress> Adresses { get; set; }
private ICollectionView _adressFilter = CollectionViewSource.GetDefaultView(Adresses);
public string AdressFilterText
{
get => _adressFilterText;
set
{
if(value != _adressFilterText)
{
_adressFilterText = value;
OnPropertyChanged("AdressFilterText");
}
_adressFilter.Filter = o =>
{
if (((Adress)o).Text.ToLower().Contains(value.ToLower())) return true;
else return false;
};
}
}
private string _adressFilterText;
Сборка персонального компьютера от Artline: умный выбор для современных пользователей