Я делаю небольшой проект для домашних животных в WPF, к которому я довольно нов.
Моя (частичная) цель такова:
- Открыть главное окно, которое содержит два В выпадающих списках «Система и документы»
- После загрузки этого окна я подключаюсь к файлу .mdb, содержащему таблицу со столбцами «Система» и «Документ».
- Создает ObservableCollection всех отдельных имен системы, хранящихся в файл базы данных и сохраняет их в виде arrayList, к которому привязан мой «Системный» список. Он успешно заполняет комбинированный список и выбирает первый элемент списка в качестве выбранного элемента.
- Выбранный элемент комбинированного списка «Система» - OneWayToSource, связанный со строкой с именем SystemFilter. Каждый раз, когда я изменял выбор, эта строка успешно обновлялась.
- С помощью этого SystemFilter мне удается отфильтровать документы и получить соответствующий список заголовков, который хранится в наблюдаемой коллекции TitleList и правильно заполняет комбинированный список «Document».
Работает нормально, однако каждый раз, когда я фильтрую базу данных, я создаю соединение с файлом, фильтрую содержимое, извлекаю его и закрываю соединение. Здесь, чтобы не открывать это соединение каждый раз, я решил загрузить все элементы в одну коллекцию ObservableCollection, называемую DocumentList, и намереваюсь выполнить для нее запросы LINQ. и результаты запроса, которые я храню в списках, которые я связываю со списком. ПРОБЛЕМА: Однако в этом случае список элементов Combobox не хочет обновлять автоматически, когда я выбираю другую систему. В чем может быть причина этого?
/ Примечание: я применил INotifyPropertyChanged в моей BaseViewModel и использую FodyWeaver для плетения своей сборки)
Оригинальная рабочая версия:
Два поля со списком:
<!--System-->
<TextBlock Margin="5 0 0 0" Text="System" FontWeight="Bold" HorizontalAlignment="Left"/>
<ComboBox SelectionChanged="Combobox_Doc_Sys_SelectionChanged" x:Name="Combobox_Doc_Sys"
ItemsSource="{Binding SystemList}" SelectedItem="{Binding SystemFilter,Mode=OneWayToSource}"
SelectedIndex="{Binding SystemIndex, Mode=TwoWay}" Padding="2" Margin="5 0 5 0" >
</ComboBox>
<!--Document-->
<TextBlock Margin="5 10 0 0" Text="Document" FontWeight="Bold" HorizontalAlignment="Left"/>
<ComboBox x:Name="Combobox_Doc_Doc" SelectionChanged="Combobox_Doc_Doc_SelectionChanged" ItemsSource="{Binding TitleList}" SelectedItem="{Binding TitleFilter, Mode=OneWayToSource}"
Padding="2" Margin="5 0 5 0" SelectedIndex="0">
</ComboBox>
Код позади MainWindow
public MainWindow()
{
InitializeComponent();
//Create ViewModel correalating to mainwindow
this.DataContext = new MainWindowViewModel();
}
/// <summary>
/// Event correlating the change of the selected item in Document section's System combobox
///// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void Combobox_Doc_Sys_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
//Call ViewModel's function to filter documentlist based on the Selected system
MainWindowViewModel.GetListOfTitle();
//MainWindowViewModel.GetListOfTitle2();
// Restores the selection to the first item in Document section's Document combobox
Combobox_Doc_Doc.SelectedIndex = 0;
}
Функция GetListOfTitle () с подключением к функции Файл .mdb:
public static void GetListOfTitle()
{
//List that will store the list of the title
//filtering SQL
string sysFilterSQL = $"SELECT * FROM DocList WHERE System='{SystemFilter}'";
//Clear List for safety sake
TitleList.Clear();
using (OleDbConnection MyConnection = new OleDbConnection(ConnectStringDocList))
{
OleDbCommand command = new OleDbCommand(sysFilterSQL, MyConnection);
command.Connection = MyConnection;
MyConnection.Open();
OleDbDataReader reader = command.ExecuteReader();
//We fill up TitleList with the list of the titles filtered by "system"
while (reader.Read())
{
var item = reader.GetString(2);
TitleList.Add(item);
}
//Close reader
reader.Close();
//Close connection
MyConnection.Close();
}
}
Параметры
public static ObservableCollection<string> TitleList { get; set; } = new ObservableCollection<string>();
publi c stati c string SystemFilter {get; набор; } = String.Empty;
Когда я перехожу на новую версию, где сначала успешно заполняю DocumentList с документами. Метод GetListofTitle2:
internal static void GetListOfTitle2()
{
TitleList = (from s in DocumentList where s.System == $"{SystemFilter}" select s.Title).ToList();
}
С:
public static ObservableCollection<DocumentModel> DocumentList { get; set; } = new ObservableCollection<DocumentModel>();
//--------------------------------------------------------------------------------------------//
public static string SystemFilter { get; set; } = String.Empty;
//--------------------------------------------------------------------------------------------//
public static List<string> TitleList { get; set; } = new List<string>();
В этой новой версии TitleList снова обновляется правильно, но не обновляется в интерфейсе: / В чем проблема? Я хотел бы решить его, потому что это решение кажется чище, чем при каждом открытии соединения и загрузке в файл .mdb
Спасибо за заранее полученные ответы
ОБНОВЛЕНИЕ: Если я изменю вторую версию до используйте observableCollections и измените GetListofTitle2 следующим образом:
public static void GetListOfTitle2()
{
TitleList =new ObservableCollection<string>((from s in DocumentList where s.System == $"{SystemFilter}" select s.Title).ToList());
}
Он все еще не обновляет комбинированный список, даже если TitleList содержит правильные элементы.