【问题标题】:Wrappanel Not Updating After Drag&Drop Files拖放文件后包装面板未更新
【发布时间】:2020-08-08 18:48:48
【问题描述】:

我有一个里面有 ItemsControl 和 Wrappanel 的视图。通过使用拖放文件,我正在尝试更新 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 并在 wrappanel 中列出新文件的数据。 FileCard UserControl没有问题,我只是尝试使用标签列出数据。(只是一个测试)

不知道是不是Drag&Drop事件及其代码有问题。

谢谢。

【问题讨论】:

  • ItemsSource 绑定到 Files 属性看起来很奇怪,但是您从 StorageBrowser_Drop 事件处理程序更新了 TempFiles 属性。

标签: c# wpf wrappanel propertychanged


【解决方案1】:

我认为您实际上可能在这里遇到了一些问题。

首先,实现 DragOver 而不是 DragEnter,否则你将无法将文件拖放到其中。

其次,去掉 ScrollViewer,让 ItemsControl 自己管理滚动。这有很多原因(其中最重要的是虚拟化),但请相信我:永远不要将 ItemsControl 放在 ScrollViewer 中。

接下来,去掉垂直的 StackPanel。通过将所有内容放在堆栈面板中,您可以根据已绑定的项目数量来调整 ItemsControl 的大小,因此将文件放到它下面的那个大空白区域不会做任何事情。将 WrapPanel 的背景设置为您可以实际看到的颜色,并确保它覆盖了您认为的页面区域。最好的方法是使用父 Grid 进行布局,然后使用 Button 和 ItemsControl 填充它,并相应地设置对齐属性。

此代码的最大问题是您的 TopMenuBorder_MouseDown 处理程序正在更新 TempFiles,但您的 ItemsControl 绑定到 Files

【讨论】:

  • 感谢您的信赖。我尝试使用 DragOver 而不是 DragEnter 但它不起作用。 TempFiles 用于测试按钮。按钮、堆栈面板和临时文件是临时的,我删除了它们。这不是因为我得到的 DragOver。
猜你喜欢
  • 1970-01-01
  • 2015-12-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-19
  • 2011-08-30
  • 2015-01-17
  • 2021-08-14
相关资源
最近更新 更多