Использование neo4j в качестве источника данных для окна автозаполнения WPF - PullRequest
0 голосов
/ 19 февраля 2020

Я пытаюсь заставить TextBox автозаполнения работать с neo4j в качестве источника данных, для этого мне нужно вернуть все найденные элементы в виде списка, где я могу «искать» внутри.

У меня есть Список, и у меня есть соединение с запросом к базе данных neo4j, чтобы получить всех людей по их имени. Отображается MessageBox, просто для проверки, если мы получаем данные, но если я ввожу букву в своем текстовом поле, Приложение просто зависает.

Код:

public partial class UserControlQueryDB : UserControl
{
    public UserControlQueryDB()
    {
        InitializeComponent();
        GetSuggestionsFromNeoAsync();
    }

    private async Task<List<string>> GetSuggestionsFromNeoAsync() {

IDriver driver = GraphDatabase.Driver("bolt://localhost:7687", AuthTokens.Basic("neo4j", "neo4j"));
IAsyncSession session = driver.AsyncSession(o => o.WithDatabase("neo4j"));

            var query2Neo = "MATCH (n:Person) RETURN n.Name";

            IResultCursor cursor = await session.RunAsync(query2Neo);
            List<string> found = await cursor.ToListAsync(record => record["name"].As<string>());

            await cursor.ConsumeAsync();
            await session.CloseAsync();
            await driver.CloseAsync();

        return found;
    }

    private void TextBox_KeyUp(object sender, KeyEventArgs e)
    {
        bool found = false;
        var border = (resultStack.Parent as ScrollViewer).Parent as Border;
        var data = GetSuggestionsFromNeoAsync();

        MessageBox.Show(data);

        string query = (sender as TextBox).Text;

        if (query.Length == 0)
        {
            // Clear
            resultStack.Children.Clear();
            border.Visibility = Visibility.Collapsed;
        }
        else
        {
            border.Visibility = Visibility.Visible;
        }

        // Clear the list
        resultStack.Children.Clear();

        // Add the result
        foreach (var obj in data.Result)
        {
            if (obj.ToLower().StartsWith(query.ToLower()))
            {
                // The word starts with this... Autocomplete must work
                addItem(obj);
                found = true;
            }
        }

        if (!found)
        {
            resultStack.Children.Add(new TextBlock() { Text = "No results found." });
        }
    }

    private void addItem(string text)
    {
        TextBlock block = new TextBlock();

        // Add the text
        block.Text = text;

        // A little style...
        block.Margin = new Thickness(2, 3, 2, 3);
        block.Cursor = Cursors.Hand;

        // Mouse events
        block.MouseLeftButtonUp += (sender, e) =>
        {
            textBox.Text = (sender as TextBlock).Text;
        };

        block.MouseEnter += (sender, e) =>
        {
            TextBlock b = sender as TextBlock;
            b.Background = Brushes.PeachPuff;
        };

        block.MouseLeave += (sender, e) =>
        {
            TextBlock b = sender as TextBlock;
            b.Background = Brushes.Transparent;
        };


    }

}

То есть Xaml:

        <StackPanel Orientation="Horizontal">
        <TextBox Width="300" Padding="5, 3, 5, 3" KeyUp="TextBox_KeyUp" Name="textBox" />
        <Border Width="298" Height="150" BorderBrush="Black" BorderThickness="1">
            <ScrollViewer VerticalScrollBarVisibility="Auto">
                <StackPanel Name="resultStack"></StackPanel>
            </ScrollViewer>
        </Border>
    </StackPanel>

1 Ответ

0 голосов
/ 19 февраля 2020

Не забудьте await ваш async метод в обработчике событий (и добавить ключевое слово async в подпись обработчика событий):

private async void TextBox_KeyUp(object sender, KeyEventArgs e)
{
    bool found = false;
    var border = (resultStack.Parent as ScrollViewer).Parent as Border;
    var data = await GetSuggestionsFromNeoAsync(); //<--
...
...