ViewDiskModel.DeleteSelectedFiles.Execute(null) не удаляет файлы

Мое приложение не удаляло файлы сохранения на странице загрузки в изолированном хранилище. Ниже приведены коды для удаления и класса ViewDiskModel.cs:

Загрузка страницы.cs

private void button2_Click(object sender, RoutedEventArgs e)
    {
        ViewDiskModel model = lstBox1.DataContext as ViewDiskModel;

        int m_iSelectedLoad = lstBox1.SelectedIndex;
        if (m_iSelectedLoad >= 0)
        {
            model.DeleteSelectedFiles.Execute(null);


        }

        MessageBox.Show("Files Successfully Deleted");
    } 

ViewDiskModel.cs:

 public class FileItem : ModelBase
    {

        public bool isChecked;
        public bool IsChecked
        {
            get { return this.isChecked; }
            set
            {
                this.isChecked = value;
                this.OnPropertyChanged("IsChecked");
            }
        }


        public string FileName { get; set; }
        public string FileText { get; set; }



    }

    public class ViewDiskModel : ModelBase
    {
        private IsolatedStorageFile currentStore;
        public IsolatedStorageFile Store
        {
            get
            {
                this.currentStore = this.currentStore ?? IsolatedStorageFile.GetUserStoreForApplication();
                return this.currentStore;
            }
        }

        private ObservableCollection<FileItem> _files;
        public ObservableCollection<FileItem> Files
        {
            get
            {
                this._files = this._files ?? this.LoadFiles();
                return this._files;
            }
        }

        private ObservableCollection<FileItem> LoadFiles()
        {
            ObservableCollection<FileItem> files = new ObservableCollection<FileItem>();

            foreach (string filePath in this.Store.GetFileNames())
                files.Add(new FileItem { FileName = filePath });
            return files;
        }

        private ICommand _deleteSelectedFiles;
        public ICommand DeleteSelectedFiles
        {
            get
            {
                this._deleteSelectedFiles = this._deleteSelectedFiles ?? new DelegateCommand(this.OnDeleteSelected);
                return this._deleteSelectedFiles;
            }
        }

        private ICommand _readSelectedFiles;
        public ICommand ReadSelectedFiles
        {
            get
            {
                this._readSelectedFiles = this._readSelectedFiles ?? new DelegateCommand(this.OnReadSelected);
                return this._readSelectedFiles;
            }
        }

        private void OnDeleteSelected()
        {
            IsolatedStorageFile storage = IsolatedStorageFile.GetUserStoreForApplication();
            List<FileItem> removedItems = new List<FileItem>();
            foreach (var item in this.Files)
            {
                if (item.IsChecked)
                    if (storage.FileExists(item.FileName))
                    {
                        storage.DeleteFile(item.FileName);
                        removedItems.Add(item);
                    }
            }

            foreach (var item in removedItems)
                this.Files.Remove(item);
        }

        private void OnReadSelected()
        {
            IsolatedStorageFile storage = IsolatedStorageFile.GetUserStoreForApplication();
            List<FileItem> removedItems = new List<FileItem>();
            foreach (var item in this.Files)
            {
                if (item.IsChecked)
                    if (storage.FileExists(item.FileName))
                    {
                        storage.DeleteFile(item.FileName);
                        removedItems.Add(item);
                    }
            }

            foreach (var item in removedItems)
                this.Files.Remove(item);
        }


    }

Загрузка страницы. XAML:

<!--ContentPanel - place additional content here-->
        <Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0" DataContext="{StaticResource vmDiskModel}">
            <Button Content="Back" Height="72" HorizontalAlignment="Left" Margin="0,530,0,0" Name="button1" VerticalAlignment="Top" Width="160" Click="button1_Click" />
            <Button Content="Delete" Height="72" HorizontalAlignment="Left" Margin="150,530,0,0" Name="button2" VerticalAlignment="Top" Width="160" Click="button2_Click" />
            <Button Content="Continue" Height="72" HorizontalAlignment="Left" Margin="296,530,0,0" Name="button3" VerticalAlignment="Top" Width="160" Click="button3_Click" />
            <TextBlock Height="30" HorizontalAlignment="Left" Margin="6,6,0,0" Name="textBlock1" Text="PLease select a save file to load." VerticalAlignment="Top" />
            <ListBox ItemsSource="{Binding Files}" Margin="0,42,0,115" SelectionChanged="ListBox_SelectionChanged" Name="lstBox1" DataContext="{StaticResource vmDiskModel}">
                <ListBox.ItemTemplate>
                    <DataTemplate >
                        <CheckBox IsChecked="{Binding IsChecked}" Content="{Binding FileName}" />
                    </DataTemplate>
                </ListBox.ItemTemplate>
            </ListBox>
        </Grid>
    </Grid>

person lala    schedule 20.06.2011    source источник
comment
что происходит, когда вы запускаете код? какие-либо ошибки? Если да, то? и на какой линии?   -  person Matt Lacey    schedule 20.06.2011
comment
@Matt Lacey - никаких ошибок, он просто не делает то, что должен делать, удаляя файлы сохранения. Есть идеи, в чем может быть проблема?   -  person lala    schedule 20.06.2011
comment
@lala, а когда вы проходите код, он вызывает onDeleteSelected()?   -  person Matt Lacey    schedule 20.06.2011
comment
Не уверен, как проверить, но, глядя на коды, я полагаю, что он вызывает этот метод через ICommand DeleteSelectedFiles.   -  person lala    schedule 20.06.2011
comment
Это похоже на то, что он делает, но без полного примера трудно сказать, что не так. Установите точку останова в обработчике событий и выполните код (F9). Если вы запустите код как есть, что произойдет? у вас отображается окно сообщений?   -  person Matt Lacey    schedule 20.06.2011
comment
@ Мэтт Лейси - придется продолжать тмр, я надеюсь, вы будете в курсе этого, я должен решить эту проблему, несмотря ни на что. И я очень ценю вашу помощь.   -  person lala    schedule 20.06.2011
comment
@ Мэтт Лейси - ничего не происходит. Я попытался установить точку останова, и, по-видимому, сообщение об ошибке не отображается, и приложение по-прежнему не удаляет мои файлы.   -  person lala    schedule 21.06.2011
comment
Отредактировал вопрос, добавил коды XAML для страницы загрузки. Надеюсь, вы знаете, как я показывал данные на странице загрузки.   -  person lala    schedule 21.06.2011
comment
Здесь слишком многого не хватает, чтобы легко воссоздать проблему без вашего участия. Предоставьте минимальный полный пример, демонстрирующий проблему. Включите все зависимости! Я взял предоставленный вами код и добавил MVVMLight вместо того, что вы используете для ModelBase и DelegateCommand, и я получаю запуск команды, но нет файлов для удаления.   -  person Matt Lacey    schedule 21.06.2011
comment
@Matt Lacey - у меня есть еще несколько связанных файлов классов. Хотели бы вы, чтобы я тоже опубликовал те, что в вопросе?   -  person lala    schedule 21.06.2011
comment
@lala создайте рабочий проект, демонстрирующий проблему. Заархивируйте его, а затем дайте ссылку на него.   -  person Matt Lacey    schedule 21.06.2011
comment
@Matt Lacey - коды, которые я использовал, основаны на этом исходном коде, который я получил в Интернете. Вы можете обратиться к нему. В нем также есть несколько ошибок, с которыми у меня проблемы. skydrive.live.com/ Будем рады, если вы может помочь мне в этом.   -  person lala    schedule 21.06.2011


Ответы (1)


Когда я запускаю код, я получаю NullReferenceException в строке 33 в MainPage.xaml.cs
Это потому, что вы ссылались на DataContext this.LayoutRoot, но никогда не устанавливали его. На самом деле вы установили DataContext для ContentPanel.
Следовательно, строка 32 должна быть такой:

ViewDiskModel model = this.ContentPanel.DataContext as ViewDiskModel;

Кроме того:
Модель представления не знала, какие элементы были проверены, поскольку вы использовали привязку свойств по умолчанию OneWay. Вам нужно изменить это на TwoWay, чтобы изменения в пользовательском интерфейсе отражались обратно в модель представления.

<CheckBox IsChecked="{Binding IsChecked, Mode=TwoWay}" Content="{Binding FileName}" />

При этих двух изменениях выбранные файлы удаляются.

Другие вопросы:

  • Кажется, есть некоторая проблема с созданием нескольких файлов один за другим, так что за раз создается только один, но я не изучал это.

  • Вы не вызываете Dispose() (или не используете директивы using) при работе с IsolatedStorageFile, который реализует IDisposable.

  • Код говорит, что он удалил файлы, даже если они не выбраны или не удалены.

  • Приложение пытается отобразить квоту IsolatedStorage, но эта концепция не существует на телефоне. Квоты нет, поэтому он показывает максимальное значение для 64-битного целого числа независимо от размера диска в телефоне.

  • А может и больше...?

person Matt Lacey    schedule 23.06.2011
comment
Спасибо за помощь, но как мне вызвать dispose()? Я могу решить часть, где код говорит, что он удалил файлы, если нет файлов для удаления. И есть еще одна проблема, когда мне приходится перезапускать приложение, чтобы сохраненные файлы отображались в списке. - person lala; 24.06.2011