UWP TreeView如何允许特定项目的删除

UWP TreeView如何允许特定项目的删除,uwp,drag-and-drop,treeview,Uwp,Drag And Drop,Treeview,使用UWP TreeView并处理需要实现将一个TreeView项拖放到另一个TreeView项的场景,具体取决于它的属性(或类型)。 例如,我在TreeView中有五个节点,其中三个是文件,两个是文件夹。文件项可以放在文件夹上,但反之亦然。我还可以将文件项从文件夹拖到根目录中,但不能将文件项拖到另一个也是文件的项目上。因此,您可以看到有多个用例来描述TreeView项的行为。 我想知道我可以扩展TreeView,然后覆盖DragEnter和DragLeave方法,也许我可以检测被拖动的参考底图

使用UWP TreeView并处理需要实现将一个TreeView项拖放到另一个TreeView项的场景,具体取决于它的属性(或类型)。 例如,我在TreeView中有五个节点,其中三个是文件,两个是文件夹。文件项可以放在文件夹上,但反之亦然。我还可以将文件项从文件夹拖到根目录中,但不能将文件项拖到另一个也是文件的项目上。因此,您可以看到有多个用例来描述TreeView项的行为。 我想知道我可以扩展TreeView,然后覆盖DragEnter和DragLeave方法,也许我可以检测被拖动的参考底图对象和被拖放到的参考底图对象。。。但是文档很混乱,太笼统而且缺乏。 我已经检查过的所有例子都考虑了树视图中的所有项目是相等的(所以我可以在不允许的文件中删除文件夹)。 这是我的树视图:

<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;
    }
}
公共类FolderInfo:MyBase//INotifyPropertyChanged
{
私有字符串_FolderName;
公共字符串FolderName
{
获取{return\u FolderName;}
设置
{
if(_FolderName!=值)
{
_FolderName=值;
OnPropertyChanged(“FolderName”);
}
}
}
私人文件夹;
公用文件夹
{
获取{return\isu folder;}
设置
{
如果(_IsFolder!=值)
{
_IsFolder=值;
OnPropertyChanged(“IsFolder”);
}
}
}
公共ObservableCollection子文件夹{get;set;}=new ObservableCollection();
公共重写字符串ToString()
{
返回FolderName;
}
}
存储文件夹只是VM中的一个可观察集合:

public ObservableCollection<FolderInfo> storageFolders { get; set; } = new ObservableCollection<FolderInfo>();
公共ObservableCollection storageFolders{get;set;}=new ObservableCollection();
您可以首先通过调用DragEnter事件处理程序中的方法获取所有StorageItems。然后,界面有一个,你可以用它来检查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:......
}    

您可以首先通过调用DragEnter事件处理程序中的方法获取所有StorageItems。然后,界面有一个,你可以用它来检查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:......
}    

您可以通过处理TreeView\u DragItemsCompleted事件并对args.Items列表进行互操作来进行验证。@McNline谢谢。我可以通过DragItemsCompleted事件获取我拖放的项目。但我怎样才能得到掉在(目标)上的物体呢?源项和目标项位于单个TreeView中。对此问题是否有任何有用的答案?Xavier Xie的回答对我没有帮助,因为所有可用的回调都没有执行,也没有停止删除节点的可能。您可以通过处理TreeView_DragItemsCompleted事件和互操作args.Items列表进行验证。@McNline谢谢。我可以通过DragItemsCompleted事件获取我拖放的项目。但我怎样才能得到掉在(目标)上的物体呢?源项和目标项位于单个TreeView中。对此问题是否有任何有用的答案?Xavier Xie的回答对我没有帮助,因为所有可用的回调都没有执行,也没有停止删除节点的可能性。谢谢,但是我的UWP TreeView没有执行DragEnter事件,所以我无法检查此代码是如何工作的?@VladacusB在你的帖子中,您提到了DragEnter事件。@如果您不知道如何在UWP中执行拖放操作,请使用VladacusB。请阅读。如前所述,源amd目标项位于同一树状视图中。TreeView上的DragEnter在此场景中不执行。请仔细阅读。即使源项和目标项位于同一个树状视图中,您仍然可以处理拖放操作。您可以处理TreeView的DragItemsStarting事件和TreeView的DragEnter事件。你想过吗?谢谢,但是我的UWP TreeView不执行DragEnter事件,所以我无法检查此代码的工作原理?@vladacubs在你的帖子中,你提到了DragEnter事件。@vladacubs如果你不知道如何在UWP中执行拖放操作。请阅读。如前所述,源amd目标项位于同一树状视图中。TreeView上的DragEnter在此场景中不执行。请仔细阅读。即使源项和目标项位于同一个树状视图中,您仍然可以处理拖放操作。您可以处理TreeView的DragItemsStarting事件和TreeView的DragEnter事件。你想过吗?