WPF MVVM: поиск и scroll в listview

391
31 мая 2017, 02:41

Есть listview. Он забайдин с ObservableCollection<MyObject>. Возможно ли организовать поиск "на лету" по коллекции с выделением найденного? Т.е. есть TextBox с триггером EventName="TextChanged" и при вводе туда символов, в listview отображать подходящие записи. Нашел такой вариант, но мне нужен MVVM.

Answer 1

Задача решается легко, кроме Binding ничего не требуется.
Разметка:

<Grid>
    <Grid.RowDefinitions>
        <RowDefinition Height="Auto"/>
        <RowDefinition/>
    </Grid.RowDefinitions>
    <TextBox Text="{Binding Pattern, UpdateSourceTrigger=PropertyChanged}"
             Margin="5,5,5,0" Padding="3"/>
    <ListBox Grid.Row="1" Margin="5"
             ItemsSource="{Binding Strings}"
             SelectedItem="{Binding Selected}"/>
</Grid>

ViewModel:

class MainVM : INotifyPropertyChanged
{
    string _pattern;
    public string Pattern
    {
        get => _pattern;
        set
        {
            Set(ref _pattern, value);
            Selected = Strings.FirstOrDefault(s => s.StartsWith(Pattern));
        }
    }
    string _selected;
    public string Selected
    {
        get => _selected;
        set => Set(ref _selected, value);
    }
    public ObservableCollection<string> Strings { get; }
    public MainVM()
    {
        Strings = new ObservableCollection<string>
        {
            "Телевизор",
            "Телефон",
            "Кровать",
            "Чемодан",
            "Стол",
            "Шкаф",
            "Чайник"
        };
    }
    protected void Set<T>(ref T field, T value, [CallerMemberName] string propertyName = "")
    {
        field = value;
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }
    public event PropertyChangedEventHandler PropertyChanged;
}

Добавим скролл до выделенного Item.
Подпишемся на событие в разметке:

<ListBox Grid.Row="1" Margin="5"
         ItemsSource="{Binding Strings}"
         SelectedItem="{Binding Selected}"
         SelectionChanged="OnSelectionChanged"/>

Обработчик события в MainWindow.xaml.cs:

private void OnSelectionChanged(object sender, SelectionChangedEventArgs e)
{
    var listBox = sender as ListBox;
    listBox.ScrollIntoView(listBox.SelectedItem);
}

READ ALSO
Как обрабатывать ботом сообщения -Telegram Bot Api C#

Как обрабатывать ботом сообщения -Telegram Bot Api C#

Как обрабатывать ботом сообщения, которые будут приходить, только тогдда, когда я запущу программу? Сейчас у меня так как на скрине, и когда...

245
Как сделать выравнивание в FrameworkElementFactory?

Как сделать выравнивание в FrameworkElementFactory?

Так не работает выравнивание:

199
Как измерить текст в Document-е RichTextBox

Как измерить текст в Document-е RichTextBox

Привет всемКак можно измерить ширину\высоту Document-а RichTextBox-a если в нем разные размеры шрифта

250