Проблема AutoCompleteBox с размером его источника данных, который превышает 10 тыс. Записей

Пытаясь использовать классическую структуру Wpf через AutoCompleteBox (не используя ViewModel)

как я новичок в WPF и все же приобрести знания MVVM..

Мой код на данный момент:

PS

для использования в этом примере кода исходный файл должен быть разделен табуляцией, каждая строка будет выглядеть следующим образом:

строка № ' (только для справки), разделение табуляции, значение для автозаполнения.

  1. каждая строка
  2. имеет значение
  3. разделены по
  4. Tab = "\ t"

XAML:

Главное объявление - окно

// this happens to be a borderless - window with custom buttons
<Window x:Class="AllDayWpf.MainWindow" Icon="/AllDayWpf;component/bin/Debug/ScheduledTICON.png"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:acb="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Input.Toolkit"
    xmlns:System="clr-namespace:System;assembly=mscorlib" 
    Title="Daily Tasks Srv-2" Height="555" Width="731" 
    ResizeMode="NoResize" 
    WindowStyle="None"
    AllowsTransparency="True" Background="{x:Null}"> 

<Window.Effect>
    <DropShadowEffect Opacity="0.5" BlurRadius="5" ShadowDepth="5" />
</Window.Effect>

Сетка в TabItem (я думаю, отдых не имеет значения):

<Grid>
      <ListBox Name="LBX_AddTaskOptions" SelectionChanged="LBX_AddTaskOptions_SelectionChanged"  HorizontalAlignment="Left" Margin="19,29,0,0"  VerticalAlignment="Top" Width="125" FontWeight="Bold" Background="Beige">
          <ListBoxItem Background="#9B6ADBCD" FontWeight="Bold" BorderBrush="#FF27AA27">
              <StackPanel Orientation="Horizontal">
                     <TextBlock Text="internet" Width="74"></TextBlock>
                     <Image Source="Images\IE_BlackRed.png" Height="30"></Image>
               </StackPanel>
          </ListBoxItem>
          <ListBoxItem Background="#9B6ADBCD" FontWeight="Bold" BorderBrush="#FF27AA27">
               <StackPanel Orientation="Horizontal">
                     <TextBlock Text="Local Folder" Width="74"></TextBlock>
                     <Image Source="Images\Folder_Black.png" Height="30" Width="32"></Image>
             </StackPanel>
      </ListBoxItem>
  </ListBox>
      <acb:AutoCompleteBox Name="UrlACBXml" ValueMemberPath="url" HorizontalAlignment="Left" Grid.Column="1" Width="296" Margin="150,23,0,156" Background="#FFEDF4AB">
           <acb:AutoCompleteBox.ItemTemplate>
                 <DataTemplate>

                      <StackPanel Orientation="Horizontal">

                            <TextBlock Text="{Binding url}" FontWeight="Bold" Foreground="Black" Width="30"/>
                       </StackPanel>
                  </DataTemplate>
              </acb:AutoCompleteBox.ItemTemplate>    
       </acb:AutoCompleteBox>
</Grid>

вот где мне нужно было автозаполнение.ACB начальная видимость = скрытая
затем, если пользователь выбирает пункт интернет, это ACB Превратимся в Видимое.

(просто идея, не реализованная здесь на данном этапе)

C# Автозаполнение кода.

public MainWindow()
{
    InitializeComponent();

    MyUrlObsrvblCollcntFactory UrlObsrCollcntFctry= new MyUrlObsrvblCollcntFactory();
    UrlACBXml.ItemsSource = UrlObsrCollcntFctry.AutComplObsrvblCllctn;
}

public class MyUrlObsrvblCollcntFactory
{
    public class URLsSrcClss
    {
        public string url { get; set; }
    }
    String path = System.IO.Path.Combine(Environment.CurrentDirectory,"tst.txt");
    string[] testit;
    public ObservableCollection<URLsSrcClss> AutComplObsrvblCllctn { get; set; }
    public MyUrlObsrvblCollcntFactory()
    {
        if (File.Exists(path))
        {
            testit = File.ReadLines(path).ToArray();
            foreach (var item in testit)
            {
                var TabSeparatedItemArr = item.Split('\t');
                this.AutComplObsrvblCllctn.Add( new URLsSrcClss { url = TabSeparatedItemArr[1] }
                );
            }
        }
    }
}

проблема в том, что когда я проверил автозаполнение, я использовал

ObservableCollection<URLsSrcClss> AutComplObsrvblCllctn = new ObservableCollection<URLsSrcClss> 
{
    new URLsSrcClss {url = "say yhoo..."},
    new URLsSrcClss {url = "...google..."},
};

это сработало

хотя изменение кода, генерируемого из большого источника данных, я думаю, что нарушает функциональность. по крайней мере, сейчас я так думаю.

Есть идеи, что не так в моем коде?

1 ответ

Решение

Теперь он работает, я просто сделал ошибку, не инициализировав его должным образом, приведенный выше код работать не будет, я решил оставить это как вопрос... с моим ответом также... для будущих посетителей.

поэтому любой новый разработчик, у которого есть проблемы с реализацией WPF AutoCompleteBox, мог бы иметь это хорошее решение для решения этой проблемы.

        public ObservableCollection<URLsSrcClss> AutComplObsrvblCllctn = new ObservableCollection<URLsSrcClss>();

Сказав это, вы можете поделиться своими мыслями, идеями, критиками или советами...

так что если у вас есть, пожалуйста, прокомментируйте это здесь.

Благодарю.

Другие вопросы по тегам