Мне кажется, я нашел проблему.Я вставил проблемный код ниже, чтобы другие посетители могли воспользоваться этим ответом.
// Your code from GitHub unchanged
private async void Preview_Click(object sender, System.Windows.RoutedEventArgs e)
{
vm.Files = new List<InstrumentFile>();
try
{
for (int i = 0; i < InstrumentList.Items.Count; i++)
{
ListBoxItem lbi = (InstrumentList.ItemContainerGenerator.ContainerFromIndex(i)) as ListBoxItem;
ContentPresenter cp = GetFrameworkElementByName<ContentPresenter>(lbi);
DataTemplate dt = InstrumentList.ItemTemplate;
CheckBox cb = (dt.FindName("InstrumentChecked", cp)) as CheckBox;
if (cb.IsChecked == true)
{
List<InstrumentFile> instrumentFiles = new List<InstrumentFile>();
Instrument instrument = ((Instrument)(InstrumentList.Items[i]));
string[] files = Directory.GetFiles(instrument.FileSource);
foreach (string file in files)
{
FileInfo fi = new FileInfo(file);
instrumentFiles.Add(new InstrumentFile()
{
Name = fi.Name,
Source = instrument.FileSource,
Destination = instrument.Destination,
ArchiveLocation = instrument.ArchiveLocation
});
}
if (string.IsNullOrEmpty(instrument.FileExt) == false)
{
IEnumerable<InstrumentFile> filteredFiles = instrumentFiles.Where(f => f.Name.ToUpper().EndsWith(instrument.FileExt.ToUpper()));
if (filteredFiles.Count() > 0)
vm.Files.AddRange(filteredFiles);
}
else
{
if (instrumentFiles.Count > 0)
vm.Files.AddRange(instrumentFiles);
}
}
}
}
catch (Exception ex)
{
await metroWindow.ShowMessageAsync("Exception Encountered", ex.Message, MessageDialogStyle.Affirmative, Helpers.DialogSettings());
}
FileCount.Content = vm.Files.Count.ToString() + " files";
}
Здесь вы инициализируете свойство Files
в модели представления.Это приводит к обновлению привязки данных к пустому списку.Там нет проблем до сих пор.Однако затем вы добавляете вещи в Files
, но эти изменения не распространяются на систему привязки данных, поскольку список в модели представления не является ObservableCollection
.
. Эту проблему можно исправить впара способов.Одним из типов исправления является установка свойства Files
в модели представления после того, как вы создали и заполнили список.Новый код будет выглядеть так (сокращенно):
private async void Preview_Click(object sender, System.Windows.RoutedEventArgs e)
{
// Create new variable to store the list
var files = new List<InstrumentFile>();
// You do a bunch of things, but you now add items to files, not to vm.Files
files.AddRange(filteredFiles);
// Finally, change Files
vm.Files = files
}
Эта последняя строка вызовет событие PropertyChanged
в модели представления для обновления привязки данных, но будет сделано с полным спискомitems.
Второй тип исправлений - это изменение типа Files
в вашей модели вида на ObservableCollection<InstrumentFile>
.Каждый раз, когда вы вносите изменение в Files
, возникает правильное событие для обновления привязки данных.