Wrappanel не обновляется после перетаскивания файлов - PullRequest
0 голосов
/ 25 апреля 2020

У меня есть представление, в котором есть ItemsControl и Wrappanel. Используя Drag & Drop файлы, я пытаюсь обновить Wrappanel. У меня есть все данные, связанные с файлами в JsonFile. Нет проблем с добавлением данных в файл json. Это работает. При повторной отладке решения я вижу список файлов в Wrappanel.

 public partial class StorageView : Window
{
    readonly StorageViewModel _storageViewModel;
    public StorageView()
    {
        _storageViewModel = new StorageViewModel();            
        InitializeComponent();
    }

    private void TopMenuBorder_MouseDown(object sender, MouseButtonEventArgs e)
    {
        if (e.ChangedButton == MouseButton.Left)
        {
            this.DragMove();
        }
    }

    // Wrappanel Drop
    private void StorageBrowser_Drop(object sender, DragEventArgs e)
    {
        string[] files = (string[])e.Data.GetData(DataFormats.FileDrop);

        List<string> files2 = new List<string>();

        foreach (var file in files)
        {
            files2.Add(file);
        }

        _storageViewModel.TempFiles = files2;
    }

    // Drag Enter
    private void StorageBrowser_DragEnter(object sender, DragEventArgs e)
    {
        if (e.Data.GetDataPresent(DataFormats.FileDrop))
            e.Effects = DragDropEffects.Move;
        else
            e.Effects = DragDropEffects.None;
    }

    private void CreateNewFolder_Click(object sender, RoutedEventArgs e)
    {


    }
}




 <ScrollViewer Grid.Row="1" VerticalScrollBarVisibility="Auto">
                <StackPanel Orientation="Vertical">
                    <Button Command="{Binding AddFileCommand}" Content="Add File"/>
                    <ItemsControl ItemsSource="{Binding Files, UpdateSourceTrigger=PropertyChanged}">
                        <ItemsControl.ItemsPanel>
                            <ItemsPanelTemplate>
                                <WrapPanel Name="StorageBrowser" Background="White" Drop="StorageBrowser_Drop" DragEnter="StorageBrowser_DragEnter" VerticalAlignment="Stretch" AllowDrop="True" Orientation="Horizontal"/>
                            </ItemsPanelTemplate>
                        </ItemsControl.ItemsPanel>
                        <ItemsControl.ItemTemplate>
                            <DataTemplate>
                                <Label Content="{Binding FileName}"/>
                                <!--<comp:FileCard/>-->
                            </DataTemplate>
                        </ItemsControl.ItemTemplate>
                    </ItemsControl>
                </StackPanel>                   
            </ScrollViewer> 





public class StorageViewModel : Screen, INotifyPropertyChanged
{
    #region Commands

    private ICommand _addFileCommand;
    private bool canExecute = true;
    public bool CanExecute
    {
        get
        {
            return this.canExecute;
        }

        set
        {
            if (this.canExecute == value)
            {
                return;
            }

            this.canExecute = value;
        }
    }
    public ICommand AddFileCommand
    {
        get
        {
            return _addFileCommand;
        }

        set
        {
            _addFileCommand = value;
        }
    }

    #endregion

    #region Notify
    public event PropertyChangedEventHandler PropertyChanged;
    protected virtual void OnPropertyChanged(string propertyName)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }
    #endregion

    #region FileModel

    private int _id;
    private string _fileName;
    private string _fullFileName;
    private decimal _fileSize;
    private string _fileType;
    private string _fileIcon;
    private string _fileExtension;
    private string _fileSizeType;
    private string _fileImage;
    private string _fullFileSize;
    private string _fileOwner;
    private DateTime? _created;
    private DateTime? _modified;
    private DateTime? _lastAccessed;
    private bool _isVersionFile;
    private List<FileModel> _fileVersions;

    public List<FileModel> FileVersions
    {
        get { return _fileVersions; }
        set { _fileVersions = value; OnPropertyChanged(nameof(FileVersions)); }
    }
    public bool IsVersionFile
    {
        get { return _isVersionFile; }
        set { _isVersionFile = value; OnPropertyChanged(nameof(IsVersionFile)); }
    }
    public DateTime? LastAccess
    {
        get { return _lastAccessed; }
        set { _lastAccessed = value; OnPropertyChanged(nameof(LastAccess)); }
    }
    public DateTime? Modified
    {
        get { return _modified; }
        set { _modified = value; OnPropertyChanged(nameof(Modified)); }
    }
    public DateTime? Created
    {
        get { return _created; }
        set { _created = value; OnPropertyChanged(nameof(Created)); }
    }
    public string FileOwner
    {
        get { return _fileOwner; }
        set { _fileOwner = value; OnPropertyChanged(nameof(FileOwner)); }
    }
    public string FullFileSize
    {
        get { return _fullFileSize; }
        set { _fullFileSize = value; OnPropertyChanged(nameof(FullFileSize)); }
    }
    public string FileImage
    {
        get { return _fileImage; }
        set { _fileImage = value; OnPropertyChanged(nameof(FileImage)); }
    }
    public string FileSizeType
    {
        get { return _fileSizeType; }
        set { _fileSizeType = value; OnPropertyChanged(nameof(FileSizeType)); }
    }
    public string FileExtension
    {
        get { return _fileExtension; }
        set { _fileExtension = value; OnPropertyChanged(nameof(FileExtension)); }
    }
    public string FileIcon
    {
        get { return _fileIcon; }
        set { _fileIcon = value; OnPropertyChanged(nameof(FileIcon)); }
    }
    public string FileType
    {
        get { return _fileType; }
        set { _fileType = value; OnPropertyChanged(nameof(FileType)); }
    }
    public decimal FileSize
    {
        get { return _fileSize; }
        set { _fileSize = value; OnPropertyChanged(nameof(FileSize)); }
    }
    public string FullFileName
    {
        get { return _fullFileName; }
        set { _fullFileName = value; OnPropertyChanged(nameof(FullFileName)); }
    }
    public string FileName
    {
        get { return _fileName; }
        set { _fileName = value; OnPropertyChanged(nameof(FileName)); }
    }
    public int Id
    {
        get { return _id; }
        set { _id = value; OnPropertyChanged(nameof(Id)); }
    }

    #endregion

    #region Collections

    private List<string> _tempFiles { get; set; }
    public List<string> TempFiles { get { return _tempFiles; } set { _tempFiles = value; OnPropertyChanged("TempFiles"); } }


    private ObservableCollection<FileModel> _files { get; set; }
    public ObservableCollection<FileModel> Files { get { return _files; } set { _files = value; OnPropertyChanged("Files"); } }

    #endregion

    public StorageViewModel()
    {
        AddFileCommand = new RelayCommand(AddFile, param=>this.canExecute);
        Files = new ObservableCollection<FileModel>(Documentive.GCS.DataAccess.GCSDataAccess.GetDataFromJson());
    }

    public void AddFile(object o)
    {          
        foreach (var file in TempFiles)
        {
            Documentive.GCS.DataAccess.GCSDataAccess.AppendDataToFileJson(file);
        }

        Files.Clear();
        Files = Documentive.GCS.DataAccess.GCSDataAccess.GetDataFromJson();
    }
}

Там есть все мои коды. Мне нужно обновить ItemsControl и вывести список данных новых файлов в оболочку. С FileCard UserControl проблем нет, я просто попытался составить список данных с помощью метки. (Просто тест)

Я не знаю, есть ли проблема с событием Drag & Drop и его кодами или нет.

Спасибо.

1 Ответ

0 голосов
/ 25 апреля 2020

Я думаю, что у вас могут возникнуть некоторые проблемы.

Прежде всего, используйте DragOver вместо DragEnter, иначе вы не сможете перетаскивать в него файлы.

Во-вторых , избавьтесь от ScrollViewer и позвольте ItemsControl управлять самой прокруткой. Для этого есть ряд причин (не в последнюю очередь это виртуализация), но просто поверьте мне: никогда не помещайте ItemsControl в ScrollViewer.

Далее избавьтесь от вертикальной StackPanel. Помещая все в панель стека, вы сами настраиваете размер ItemsControl в соответствии с количеством элементов, к которым он уже привязан, поэтому перетаскивание файлов в большую пустую область под ним ничего не изменит. Установите цвет фона WrapPanel, который вы действительно можете видеть, и убедитесь, что он покрывает ту область страницы, о которой вы думаете. Лучший способ сделать это - использовать родительскую таблицу Grid для создания макета, а затем заполнить ее кнопками Button и ItemsControl, соответственно установив свойства выравнивания.

Самая большая проблема этого кода заключается в том, что ваш обработчик TopMenuBorder_MouseDown обновляет TempFiles, но ваш ItemsControl привязывается к Files.

...