UWP TreeView如何允许放置特定物品

时间:2019-05-31 13:40:33

标签: uwp drag-and-drop treeview

使用UWP TreeView并处理需要根据其属性(或类型)将一个TreeView项放到另一个项的方案。 例如,我在TreeView中有五个节点,其中三个是文件,两个是文件夹。可以将文件项放在“文件夹”上-但不能相反。我也可以将File项目从Folder拖到根目录中,但是不能将File项目拖放到也是File的另一个项目上。因此,您可以看到TreeView项目的行为方式有多个用例。 想知道我可以扩展TreeView,然后重写DragEnter和DragLeave方法,也许然后我可以检测到被拖动的底层对象和被拖放到...的底层对象,但是文档令人困惑,过于笼统且缺乏。 我所有检查过的示例都认为TreeView中的所有项目都相等(因此我可以将Folder放到File上,这是不允许的)。

这是我的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;
    }
}

存储文件夹只是VM中的一个ObservableCollection:

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

1 个答案:

答案 0 :(得分:0)

首先可以通过在DragEnter事件处理程序中调用DataPackageView.GetStorageItemsAsync方法来获取所有StorageItems。然后,IStorageItem界面具有一个IsOfType(StorageItemTypes) Method,您可以使用它来检查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:......
}