Как получить из Scroll View доступ к ComboBoxEdit C# WPF

344
13 июля 2022, 20:20

как получить из Scroll View доступ к ComboBoxEdit C# WPF Использую для ленивой подгрузки

private void ScrollViewer_PreviewMouseWheel(object sender, MouseWheelEventArgs e)
        {
            var scroll = (ScrollViewer)sender;
            
            if (scroll.VerticalOffset == scroll.ScrollableHeight)
            {
                Console.WriteLine("дошел до конца");
                ///var combo = LayoutTreeHelper.GetVisualChildren(scroll).OfType<ComboBoxEdit>().FirstOrDefault();
                Console.WriteLine(combo.Name);
                Console.WriteLine($"Страница: {page}");
                ///Console.WriteLine(combo.Name);
                page++;
            }
            else
            {
                Console.WriteLine("дошел до начала");
            }
            //combobox.ItemsSource = WorkFromData.DataSetting(combobox.Name,"", page,dataset.Label, dataset.Value);
        }
Answer 1

Вас спасет привязка данных.

<ComboBox Width="300"
          VerticalAlignment="Center"
          ItemsSource="{Binding Items}"
          MaxDropDownHeight="100"
          ScrollViewer.ScrollChanged="ComboBox_ScrollChanged"/>

Изначально закидываю в комбобокс 10 элементов. Как только юзер докрутит до последнего, закидываю еще 5.

public partial class MainWindow : Window, INotifyPropertyChanged
{
    private ObservableCollection<string> _items;
    public ObservableCollection<string> Items
    {
        get => _items;
        set
        {
            _items = value;
            OnPropertyChanged();
        }
    }
    public MainWindow()
    {
        InitializeComponent();
        DataContext = this;
    }
    private void Window_Loaded(object sender, RoutedEventArgs e)
    {
        Items = new ObservableCollection<string>(Enumerable.Range(0, 10).Select(x => "Item " + x));
    }
    private void ComboBox_ScrollChanged(object sender, ScrollChangedEventArgs e)
    {
        ScrollViewer viewer = (ScrollViewer)e.OriginalSource;
        if (e.VerticalOffset == viewer.ScrollableHeight)
        {
            int count = Items.Count;
            for (int i = count; i < count + 5; i++)
                Items.Add("Item " + i);
        }
    }
    public event PropertyChangedEventHandler PropertyChanged;
    protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
        => PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}

Обратите внимание, что e.VerticalOffset и viewer.ScrollableHeight по умолчанию содержат позицию элемента в списке, а не пиксели.

READ ALSO
Тестовый сервер для сайта

Тестовый сервер для сайта

Всем приветНужно использовать "временный" сервер для одного сайта и для одного пользователя

268
Автоматическое создание полей из параметров конструктора с проверкой

Автоматическое создание полей из параметров конструктора с проверкой

В Visual Studio можно объявить конструктор класса и задать в нем все необходимые параметры, а потом нажать CTRL+и создать приватное поле, которое...

225
Обновление данных в dataGridView на той же форме

Обновление данных в dataGridView на той же форме

Не получается обновить dataGridView после добавления данных в БДЕсть AssortmentForm на которой расположен dataGridView,а на дочерней форме добавляется запись...

170
Exe файл в качестве операционной системы

Exe файл в качестве операционной системы

Идея такая: есть исполняемый файл, написанный на C# (консольная программа)Он находится на флешке

235