Проблема AutoCompleteBox с размером его источника данных, который превышает 10 тыс. Записей
Пытаясь использовать классическую структуру Wpf через AutoCompleteBox (не используя ViewModel)
как я новичок в WPF
и все же приобрести знания MVVM
..
Мой код на данный момент:
PS
для использования в этом примере кода исходный файл должен быть разделен табуляцией, каждая строка будет выглядеть следующим образом:
строка № ' (только для справки), разделение табуляции, значение для автозаполнения.
- каждая строка
- имеет значение
- разделены по
- 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>();
Сказав это, вы можете поделиться своими мыслями, идеями, критиками или советами...
так что если у вас есть, пожалуйста, прокомментируйте это здесь.
Благодарю.