Привязка ObservableCollection к нескольким представлениям списка не работает - PullRequest
2 голосов
/ 28 марта 2019

Я новичок в программировании, и мне трудно понять, как заставить мою ObservableCollection работать с двумя разными списками в двух разных Windows в WPF. Я думаю, что проблема заключается в том, как я реализовал свою коллекцию ObservableCollection, причем основным виновником является эта строка, как показано в классе SoundsWindow:

ViewModel vm = this.DataContext as ViewModel;

Вот как мой список отображает мои элементы, добавленные через:

vm.AddFile(fi.Name, file, 1);

Проблема в том, что это не обновляет другое представление списка в другом окне и ничего не сохраняется.

Вот моя ViewModel:

public class ViewModel : INotifyPropertyChanged
{
    public ViewModel()
    {
        SoundFiles = new ObservableCollection<SoundFile>();
    }

    public event PropertyChangedEventHandler PropertyChanged = delegate { };
    private void OnPropertyChanged(string name)
    {
        PropertyChangedEventHandler handler = PropertyChanged;
        handler(this, new PropertyChangedEventArgs(name));
    }

    public void AddFile(string fileName, string fileLocation, int groupID)
    {
        SoundFile soundfile = new SoundFile { FileName = fileName, FileLocation = fileLocation, GroupID = groupID };
        SoundFiles.Add(soundfile);
    }

    private ObservableCollection<SoundFile> soundfiles;
    public ObservableCollection<SoundFile> SoundFiles
    {
        get { return soundfiles; }
        set
        {
            soundfiles = value;
            OnPropertyChanged("SoundFiles");
        }
    }
}

Класс SoundsWindow:

public partial class SoundsWindow : Window
{
    public SoundsWindow()
    {
        InitializeComponent();

        this.DataContext = new ViewModel();

    }

    private void loadFileBtn1_Click(object sender, RoutedEventArgs e)
    {
        var ofd = new OpenFileDialog();
        ofd.Multiselect = true;
        ofd.Filter = "MP3 Files (*.mp3)|*.mp3";
        var result = ofd.ShowDialog();

        if (result == true)
        {
            ViewModel vm = this.DataContext as ViewModel;

            foreach (String file in ofd.FileNames)
            {
                FileInfo fi = new FileInfo(file);                   
                vm.AddFile(fi.Name, file, 1);
            }               
        }
    }

Мой класс SoundFile:

public class SoundFile
{
    public string FileName { get; set; }
    public string FileLocation { get; set; }
    public int GroupID { get; set; }
}

И XAML:

<ListView x:Name="FilesList1" ItemsSource="{Binding SoundFiles}" HorizontalAlignment="Left" Height="379" Margin="10,35,0,0" VerticalAlignment="Top" Width="600">
        <ListView.View>
            <GridView>
                <GridViewColumn Header="Name" DisplayMemberBinding="{Binding Path=FileName}" Width="230"/>
                <GridViewColumn Header="Location" DisplayMemberBinding="{Binding Path=FileLocation}" Width="320"/>
                <GridViewColumn Header="Group" DisplayMemberBinding="{Binding Path=GroupID}" Width="40"/>
            </GridView>
        </ListView.View>
    </ListView>

В целях тестирования другое окно является копией SoundsWindow, поэтому проблем не должно быть.

Поскольку я почти не знаю, что я делаю, я проверил все, но я почти уверен, что виновником является моя реализация того, как я добавляю и храню вещи в ObservableCollection. Любая помощь будет очень признательна.

...