RaisePropertyChanged не обновляет список в пользовательском интерфейсе после его вызова.Первоначально, когда приложение открыто, происходит обновление и список заполняется.После того, как я вызываю конструктор ViewModel (TracksVM), который запускает метод, который обновляет ObservableCollection, установщик заполняет коллекцию, но RaisePropertyChanged, похоже, не влияет на поле.
Решено:
Как предположил Клеменс, у меня было 2 экземпляра класса ViewModel, поэтому список не смог принять вновь созданный список треков, так как новый список передавался второму экземпляру.Как только я запустил код обновления на том же экземпляре объекта, список начал обновляться соответствующим образом.XAML:
<ListBox Name="DownloadsBox" ItemsSource="{Binding Tracks}" SelectedItem="{Binding SelectedTrack}" Margin="10,10,10,10" DockPanel.Dock="Top" VerticalAlignment="Stretch" HorizontalAlignment="Stretch" SelectionChanged="TracksListBox_SelectionChanged">
<ListBox.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding FileName}"/>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
ViewModel:
public class TracksVM:INotifyPropertyChanged
{
private FileManager fm;
private ObservableCollection<Track> _tracks;
public ObservableCollection<Track> Tracks
{
get => _tracks;
set
{
_tracks = value; RaisePropertyChanged("Tracks");
}
}
private ObservableCollection<string> _genres;
public ObservableCollection<string> Genres
{
get => _genres;
set { _genres = value; RaisePropertyChanged("Genres"); }
}
private Track _selectedTrack;
public Track SelectedTrack
{
get => _selectedTrack;
set
{
_selectedTrack = value; RaisePropertyChanged("SelectedTrack");
}
}
public event PropertyChangedEventHandler PropertyChanged;
private void RaisePropertyChanged(string property)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(property));
}
public TracksVM()
{
fm = new FileManager();
LoadData();
}
void LoadData()
{
Console.WriteLine("Loading Tracks in Download box");
Tracks = fm.ListOfTracks(ConfigurationManager.DownloadsDirectory).ToObservableCollection();
Genres = ConfigurationManager.Genres.ToObservableCollection();
}
}
Запуск ViewModel и, соответственно, обновление ObservableCollection:
TracksVM tVM;
internal void MoveTrack(string fileTobeMoved,string folderLocation)
{
Console.WriteLine($"Track: {fileTobeMoved}, location: {folderLocation}");
try
{
File.Move(fileTobeMoved, folderLocation);
tVM = new TracksVM();
}
catch(Exception e)
{
Console.WriteLine(e.Message);
}
}