RaisePropertyChanged не обновляет интерфейс - PullRequest
0 голосов
/ 20 декабря 2018

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);
        }
    }

1 Ответ

0 голосов
/ 23 декабря 2018

Как предположил Клеменс, у меня было 2 экземпляра класса ViewModel, поэтому список не смог принять вновь созданный список треков, поскольку новый список проходил во втором экземпляре.Как только я запустил код обновления на том же экземпляре объекта, список начал обновляться соответствующим образом.

...