UWP TreeView, как разрешить сброс для определенного элемента - PullRequest
1 голос
/ 31 мая 2019

Использование UWP TreeView и работа над сценариями, в которых мне нужно реализовать перетаскивание одного элемента TreeView в другой, в зависимости от его свойств (или типа).Например, у меня есть пять узлов в TreeView, три из них - файлы, два - папки.Элемент файла может быть удален в папку, но не наоборот.Я также могу перетащить элемент «Файл» из папки в корневой каталог, но не могу добавить элемент «Файл» в другой элемент, который также является «Файл».Таким образом, вы можете видеть, что есть несколько вариантов использования, как должны вести себя элементы TreeView.Мне было интересно, что я могу расширить TreeView и затем переопределить методы DragEnter и DragLeave, может быть, тогда я смогу обнаружить подстилающий объект, который перетаскивается, и подстилающий объект, который сбрасывается в ... но документация сбивает с толку, слишком общая и отсутствует.В примерах, которые я проверил, все элементы TreeView считаются равными (поэтому я могу удалить папку из файла, что недопустимо).

Вот мой TreeView:

<TreeView   
            x:Name="treeview" Grid.Row="2" ItemsSource="{Binding storageFolders,Mode=OneWay}" 
            Style="{StaticResource TreeViewStyle1}"
            >
            <TreeView.ItemTemplate>
                <DataTemplate x:DataType="localdata:FolderInfo">
                    <TreeViewItem ItemsSource="{x:Bind subFolders}" Content="{x:Bind FolderName}"/>
                </DataTemplate>
            </TreeView.ItemTemplate>
        </TreeView>

А вот FolderInfoтип:

    public class FolderInfo : MyBase //INotifyPropertyChanged
{
    private string _FolderName;
    public string FolderName
    {
        get { return _FolderName; }
        set
        {
            if (_FolderName != value)
            {
                _FolderName = value;
                OnPropertyChanged("FolderName");
            }
        }
    }

    private bool _IsFolder;
    public bool IsFolder
    {
        get { return _IsFolder; }
        set
        {
            if (_IsFolder != value)
            {
                _IsFolder = value;
                OnPropertyChanged("IsFolder");
            }
        }
    }

    public ObservableCollection<FolderInfo> subFolders { get; set; } = new ObservableCollection<FolderInfo>();

    public override string ToString()
    {
        return FolderName;
    }
}

Папка хранения - это просто коллекция ObservableCollection в ВМ:

public ObservableCollection<FolderInfo> storageFolders { get; set; } = new ObservableCollection<FolderInfo>();

1 Ответ

0 голосов
/ 03 июня 2019

Сначала вы можете получить все StorageItems, вызвав DataPackageView.GetStorageItemsAsync метод в обработчике событий DragEnter. Затем интерфейс IStorageItem имеет метод IsOfType (StorageItemTypes) , с помощью которого можно проверить, является ли StorageItem папкой или файлом.

private async void DropBorder_DragEnter(object sender, Windows.UI.Xaml.DragEventArgs e)
{
    var items = await e.DataView.GetStorageItemsAsync();
    foreach (IStorageItem storageItem in items)
    {
        Debug.WriteLine("IsFolder: " + storageItem.IsOfType(StorageItemTypes.Folder) + " IsFile: " + storageItem.IsOfType(StorageItemTypes.File));
    }
    //TODO:......
}    
...